반응형

가장 기본적인 테이블인 고객 테이블이랑 상품 테이블부터 만들도록 하겠습니다.

 

Maria DB - 데이터베이스 테이블 만들기

 

userTable

CREATE TABLE userTable (
	userId VARCHAR(20),
	userPw VARCHAR(20) NOT null,
	userPw1 VARCHAR(20) NOT null,
	userTel VARCHAR(20) NOT NULL,
	userGender VARCHAR(10) NOT NULL,
	userEmail VARCHAR(50) NOT NULL,
	userAddr1 VARCHAR(20) NOT NULL,
	userAddr2 VARCHAR(20) NOT NULL,
	registerDate DATE DEFAULT NOW(),
 	CONSTRAINT userTable_userId_pk PRIMARY KEY(userId)
	) charset=UTF8;

용도 : 회원 가입시에 사용하기 위함

 

userTable 구성 :

- 고객아이디

- 고객비밀번호

- 고객비밀번호 재확인

- 고객 휴대폰번호

- 고객성별

- 고객 이메일

- 고객주소

- 고객세부주소

- 회원가입 날짜

 

 

productTable

CREATE TABLE productTable (
	prdNum INT auto_increment,
	prdName VARCHAR(20) NOT null,
	categoryCode VARCHAR(20) NOT null,
	prdPrice int,
	prdCount int,
	prdinfor VARCHAR(300) NOT NULL,
	prdImg VARCHAR(200) NOT NULL,
	prdregisterDate DATE DEFAULT NOW(),
 	CONSTRAINT productTable_prdNum_pk PRIMARY KEY(prdNum)
	) charset=UTF8;

용도 : 상품들을 홈페이지에 노출 시키고 등록하기 위함

 

productTable 구성:

- 상품번호

- 상품이름

- 상품카테고리

- 상품가격

- 상품개수

- 상품정보

- 상품이미지

- 상품등록일

 

reviewTable

CREATE TABLE reviewTable (
	reNum INT AUTO_INCREMENT PRIMARY key,
	reTitle VARCHAR(20) NOT null,
	reUser VARCHAR(20) NOT null,
	reregisterDate DATE DEFAULT NOW(),
	reCnt INT DEFAULT 0 # 조회수
	) charset=UTF8;

옹도 : 고객들의 문의 게시판

 

reviewTable 구성

- 문의 글 번호

- 문의 글 제목

- 문의 글 작성자

- 문의 등록일

- 문의 조회수

 

 

MariaDB를 사용하기 위한 Pom.xml 설정
<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
		<dependency>
			<groupId>org.mariadb.jdbc</groupId>
			<artifactId>mariadb-java-client</artifactId>
		</dependency>

 

Java 파일 생성

userVo.java

productVo.java

reviewVo.java

 

여기서 각각 3개씩 만들었지만 우선 게시판과 하는 일이 비슷한 리뷰 테이블로 테스트 해보겠습니다.

Mapper 설정

pom.xml 추가 Mybatis 연동을 위한 설정

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.2</version>
		</dependency>

 

 - 위치 : src/main/resources/mappers/reviewMapper.xml
 - 쿼리문의 id와 mapper interface의 메서드명과 일치시킬 것

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mall.mapper.reviewmapper">
	<select id="reviewlist" resultType="reviewVo">
		select * from reviewTable 
	</select>
</mapper>

 

application.properties 내용 추가

# mybatis entity scan packages 뜻 Model Class Package 경로
# 선택사항입니다. 하지만 사용하지 않으면 mapper 쿼리문마다 Model 클래스 경로 작성
mybatis.type-aliases-package=com.example.mall.domain

# where mapper
# mybatis.mapper-locations : mapper.xml 경로 작성
# 현재 저는 resources경로 밑에 mappers 폴더 하위 전부를 포함하는 의미로 사용했습니다.
mybatis.mapper-locations=mappers/**/*.xml
com.example.mall.mappers.userMapper는 src/main/resources 밑에 mappers폴더를 만들고 xml 파일명

 

위치 : src/main/java 밑에 mapper 폴더 생성 후 아래와 같이 작성

reviewmapper.java

package com.example.mall.mapper;

import java.util.List;

import com.example.mall.domain.reviewVo;

public interface reviewmapper {
	
	// 문의 글 조회
	public List<reviewVo> reviewlist() throws Exception;
}

 

reviewService.java

위치 src/main/java 밑에 repository 폴더 생성 후 아래와 같이 작성

package com.example.mall.repository;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.mall.domain.reviewVo;
import com.example.mall.mapper.reviewmapper;


@Service
public class reviewService {

	@Autowired
	private reviewmapper reviewmapper;
	
	// 게시글 조회
	public List<reviewVo> reviewlist() throws Exception {
		// mapper 패키지 안의 reviewmapper.java의 문의글 조회  reviewlist메소드와 일치
		return reviewmapper.reviewlist();
	}
}

 

Controller 작성
package com.example.mall.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.example.mall.domain.reviewVo;
import com.example.mall.repository.reviewService;

@Controller
@EnableAutoConfiguration
public class reviewController {
	
	@Autowired
	private reviewService reviewservice;
	
	@GetMapping("/")
	public ModelAndView relist() throws Exception{
		ModelAndView mav = new ModelAndView("list");
		List<reviewVo> reviewlist = reviewservice.reviewlist();
		mav.addObject("relist",reviewlist);
		
		return mav;
	}
}

 

Spring boot 의 templates 에서 jsp가 작동하지 않으므로 다음과 같이 설정

pom.xml 에 내용 추가

		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
		</dependency>

추가 후 src/main 폴더 밑에 차례대로 폴더를 생성해줍니다.

webapp -> WEB-INF -> views

application.properties에 다음의 내용 추가

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

 

총 폴더는 다음과 같다.

 

현재 제 reviewTable의 값들은 다음과 같습니다.

 

jsp 파일 생성 후 웹상으로 출력하도록 하겠습니다.

list.jsp

 

출력 결과

휴 성공,,

+ 추가적으로 콘솔에 SQL문이 실행되는지 보고싶다면

pom.xml 에 다음 내용을 추가

		<!-- MyBatis sql pretty -->
		<dependency>
			<groupId>org.bgee.log4jdbc-log4j2</groupId>
			<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
			<version>1.16</version>
		</dependency>

 

resources 폴더 밑에 2개의 파일은 만들어줍니다.

log4jdbc.log4j2.properties

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

 

logback-spring.xml

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern>
    </encoder>
  </appender>
  
  <logger name="jdbc" level="OFF"/>
  
  <logger name="jdbc.sqlonly" level="OFF"/>
  <logger name="jdbc.sqltiming" level="DEBUG"/>
  <logger name="jdbc.audit" level="OFF"/>
  <logger name="jdbc.resultset" level="OFF"/>
  <logger name="jdbc.resultsettable" level="DEBUG"/>
  <logger name="jdbc.connection" level="OFF"/>
  
  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
  
</configuration>

 

콘솔 로그창

 

 

 
반응형
반응형

SELECT문

 

- 데이터베이스 내의 테이블에서 원하는 정보를 추출하는 명령어

 

SELECT문 기본 형식

 

SELECT 열이름 FROM 테이블명 [where 조건] ;

[ ] 부분은 생략이 가능합니다. 

 

USE문

 

- SELECT문을 사용하기에 앞서 해당 테이블을 사용할 데이터베이스를 지정해서 접속하여야한다.

 

USE문 기본 형식

 

USE 데이터베이스명 ;

ex) 데이터베이스명이 user라면

USE user;

라고 입력해줍니다.

 

위와 같은 문장의 의미

user 데이터베이스를 사용하겠다.

지금부터 실행하는 쿼리문은 user DB에서 수행합니다.

 

간단한 예를 만들어보겠습니다.

 

서버에 존재하는 DB를 확인하는 명령어는 다음과 같습니다

 

SHOW DATABASES;

 

데이터베이스명과 테이블명은 제가 임의로 만들었습니다.

 

ex.sql

1
2
3
4
5
6
7
8
9
10
11
CREATE DATABASE USER;
 
 
CREATE TABLE information(num INT(4), irum CHAR(15), height INT(4));
 
INSERT INTO information VALUES (1'HongGildong'158);
INSERT INTO information VALUES (2'EGildong'180);
INSERT INTO information VALUES (3'SamGildong'177);
INSERT INTO information VALUES (4'SaGildong'169);
INSERT INTO information VALUES (5'OhGildong'188);
 
 

 

 

테이블을 만드는 명령어

 

CREATE TABLE 테이블명 (컬럼명1 데이터타입1, 컬럼명2 데이터타입2);

ex)

CREATE TABLE USER (num int(4), irum char(15));

 

 

데이터베이스명 : USER

테이블명 : information

 

1
2
3
USE USER;
 
SELECT * FROM information;

 

출력결과

 

 

* 해당 출력 결과는 제가 임의로 넣은 데이터입니다.

 

관계연산자 사용

 

- 번호가 3번 이후면서 키가 180 이상인 사람을 출력

해당과 같은 출력은 위에서 말씀드렸듯 SELECT문 뒤에 where 조건문을 추가해주어야합니다.

 

1
SELECT * FROM information WHERE num >= 3 AND height >= 180;

 

출력 결과

 

- 번호가 2번 이전이거나 키가 170 이상인 사람을 출력

이번 문제는 또는의 조건을 주었습니다.

1
SELECT * FROM information WHERE num <= 2 OR height >= 170;

 

출력결과

 

 

이번에는 그냥 AND가 아닌 BETWEEN AND와 IN, LIKE를 설명해보겠습니다.

- 키가 160 ~ 180 사이의 인원을 출력

 

위 문제처럼 다음과 같이 작성 가능하지만

1
SELECT * FROM information WHERE height >= 160 AND height <= 180;

이번에는 BETWEEN AND를 사용한다면

1
SELECT * FROM information WHERE height BETWEEN 160 AND 180;

다음과 같이 작성 가능합니다.

 

출력결과

 

이번에는 OR와 IN을 비교해보도록 하겠습니다.

- num이 1번 3번 5번을 출력

1
SELECT * FROM information WHERE num=1 OR num=3 OR num=5;

 

출력결과

 

OR을 연속적으로 사용하여 구분도 가능하지만

IN()을 사용할 수도 있습니다.

1
SELECT * FROM information WHERE num IN(1,3,5);

출력 결과는 위와 동일하게 나타납니다!

 

이번에는 LIKE연산자에 대해 설명해드리겠습니다.

 

예를들어 'Hong%' 인 경우 성이 'Hong' 이고 뒤에는 어떤 것이든 허용한다는의미이다. 이 말은 Hong이 맨 첫 글자에 있는 경우 다 출력한다.

 

다음으로 '_Gildong' 의 경우는 맨 첫 1칸은 아무 글자나 들어와도 상관없지만 뒤 나머지 글자가 Gildong으로 끝나는 경우를 출력해야 한다.

 

저의 경우 뒤에 글자가 다 Gildong이므로 'Hong_______'을 출력해보겠습니다. ( _ 를 7개 사용하였습니다.)

 
1
SELECT * FROM information WHERE irum LIKE 'Hong_______';

 

출력 결과

 

 

서브 쿼리

 

쿼리문 안에 또 다른 쿼리문이 존재하는 것을 뜻한다.

- 'SaGildong' 보다 키가 크거나 같은 사람을 출력

1
SELECT * FROM information WHERE height > (SELECT height FROM information WHERE irum = 'Sagildong');

 

출력결과

 

 

ORDER BY

조건이 주어지면 해당 조건에 따라서 순서대로 나열해준다.

 

키 순서대로 출력해보겠습니다.

1
SELECT * FROM information ORDER BY height;

 

출력결과

 

 

height 뒤에 DESC를 써주면 내림차순 정렬이지만 생략시에는 자동으로 ASC가 적용되어 오름차순으로 출력됩니다.

 

* 주의할 점 : ORDER BY절은 SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, 중에서 가장 뒤에 작성되어야한다.

 

LIMIT

출력 문장 개수에 제한을 주는 명령어입니다.

 

위 문장에서는 키 순서대로 5개의 데이터가 전부 출력되었지만 이번에는 LIMIT 조건을 3으로 주어보겠습니다.

1
SELECT * FROM information ORDER BY height LIMIT 3;

 

출력결과

 

 

추가 ! 테이블을 복사하는 방법 !

테이블 복사 형식

CREATE TABLE 새로운테이블명 (SELECT 복사할컬럼 FROM 복사할테이블)

 

information 테이블을 information2로 복사한 후 출력해보겠습니다.

 

1
2
3
CREATE TABLE information2 (SELECT * FROM information);
 
SELECT * FROM information2;

 

출력 결과

 

 

동일하게 출력되는 것을 알 수 있습니다.

복사할 컬럼 부분에 원하는 조건만 추가하여 복사도 가능합니다.

 

집계함수

 

집계함수 형식

SELECT 집계함수(집계할컬럼내용) FROM 테이블명;

 

SUM과 AVG

SUM은 말 그대로 합을 뜻하며, AVG는 평균값을 뜻합니다.

5명의 키를 다 더하여 평균을 계산해보겠습니다.

 

1
2
3
SELECT SUM(height) FROM information;
 
SELECT AVG(height) FROM information;

 

출력결과

 

 

또 다른 집계 함수를 정리해보았습니다.

 

함수명 설명
AVG() 평균값
MIN() 최소값
MAX() 최대값
COUNT() 행의 개수
COUNT(DISTINCT) 행의 개수를 센다.

 

 

반응형

+ Recent posts