본문 바로가기
Web Programming/Spring

[Spring] My Batis - SQL

by Classic! 2020. 8. 5.

[SQL XML]

MyBatis에서는 SQL 쿼리문을 xml을 통해 MetaData로 만들어서 애플리케이션의 외부로 분리한다.

1. SQL XML 기본 작성방법

- resultMap

2. 값 주입

3. 정적 쿼리 / 동적 쿼리

 

MyBatis에서 sql정보를 담고 있는 xml

 

 


1. 기본 작성 방법

1) xml 파일 생성

2) mapper 태그 생성

   - namespace 지정 : 나중에 test에서 사용할 쿼리문 지정할 때 여러 쿼리문을 포괄하는 mapper의 namespace도 함께 지정. 

3) mapper 태그 안에 쿼리문 작성

   - 태그 종류 : 입력하고자 하는 쿼리 문의 종류를 태그로 지정할 수 있다. 쿼리문은 태그 안에 작성한다.

ex) <select></select>, <insert></insert>, <delete></delete> 등등

   - id 지정 : id는 DAO 단에서 사용하는 함수명과 동일하게 작성.

   - parameterType :  쿼리문 작성을 위해 전달할 데이터의 타입 지정. 이때, parameterType이 String이면 "string", int라면 "int" 등으로 입력하지만, 객체일 경우 객체명(또는 객체의 Alias)을 써준다.

//SqlMapConfig.xml에 VO 정보를 저장할 때 alias를 지정
<configuration>
	<typeAliases>
		<typeAlias type="ibatis.services.domain.User" alias="user"/>
	</typeAliases>
</configuration>

 

   - resulrType : 쿼리 실행 결과로 반환받는 값의 타입. 역시 타입이 객체일 경우 객체명(또는 객체의 Alias)을 써준다

 

<?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">
 
<!-- SQL definition -->
<mapper namespace="UserMapper01">	
	<!-- SQL Definition 
	<select id="getUser" resultType="user" parameterType="string">
		select 
		user_id as userId,
		user_name as userName,
		password as password,
		age as age,
		grade as grade,
		reg_date as regDate
		from users
		where user_id=#{value}
	</select>
</mapper>

 

★ resultMap

resultMap을 지정하지 않은 경우 쿼리문 작성 시, DB 테이블의 칼럼명이 java클래스의 VO의 필드명과 달라 매 칼럼마다 필드명을 Alias로 설정해야 한다. 이와 같은 번거로움을 줄이기 위해 쿼리문 작성 전 resultMap으로 칼럼명에 대응하는 필드명을 정의한다. 

## 자바 User VO 클래스의 필드명

public class User implements Serializable {
	///Field
    private String userId; 		// 회원 ID, user_id(컬럼명)
    private String userName;	// 회원 이름, user_name(컬럼명)
    private String password;    // 비밀번호, password(컬럼명)
    private Integer age;    	// 나이 :: Integer wrapper class 사용, age(컬럼명)
    private int grade;    		// 등급 :: int primitive 사용, grade(컬럼명) 
    private Timestamp regDate = new Timestamp(new Date().getTime()); // 가입일자, reg_date(컬럼명)
// mapper태그 아래, 쿼리문 위에 입력.
<mapper namespace="UserMapper10">
	// resultMap의 type은 VO클래스 이름(Alias), id 지정
	<resultMap type="user" id="userSelectRM">  
		<result property="userId" column="user_id"/>
		<result property="userName" column="user_name"/>
		<result property="password" column="password"/>
		<result property="age" column="age"/>
		<result property="grade" column="grade"/>
		<result property="regDate" column="reg_date"/>
	</resultMap>

	// resultMap에 위에서 정의한 resultMap의 id 입력
	<select id="getUserList" parameterType="user" resultMap="userSelectRM">
		select
		user_id		//컬럼마다 Alias를 지정 X
		,user_name
		,password
		,age 
		,grade
		,reg_date
		from users
		where user_id=#{userId}
	</select>
</mapper>


 

 


2. 쿼리로 값 전달

1) 객체로 전달

- session.selectOne(mapper의 namespace. 쿼리 태그 id, 전달할 데이터);

- user객체를 조건절에 활용하여 조건에 맞는 user의 id 리턴하기

List<User> list=session.selectOne("UserMapper01.findUserId",user);

- parameterType을 객체의 alias로 지정하고 쿼리문에서는 #{} 안에 객체의 필드명을 넣어 값을 받는다.

** #{userId} = User.getuserId()

- user의 id를 리턴하므로 resultType은 "string"

<mapper namespace="UserMapper01">	
    <select id="findUserId" resultType="string" parameterType="user">
		select 
		user_name as userName
		from users
		where user_id= #{userId} and password=#{password}
	</select>
</mapper>

 

2) 특정 값으로 전달

- session.selectOne(mapper의 namespace. 쿼리 태그 id, 전달할 데이터);

- 특정 userId값인 "userId04"를 조건절에 활용하여 조건에 맞는 user의 id 리턴하기

List<User> list=session.selectOne("UserMapper01.findUserId","userId04");

- parameterType를 전달받는 데이터의 타입에 맞게 지정하고 쿼리문에서는 #{value}로 값을 받는다.

- 마찬가지로 user의 id를 리턴하므로 resultType은 "string"

<mapper namespace="UserMapper01">	
    <select id="findUserId" resultType="string" parameterType="string">
		select 
		user_name as userName
		from users
		where user_id= #{value}
	</select>
</mapper>

 


3. 정적 쿼리/동적 쿼리

- 정적인 쿼리 : where절 조건에 따라 select문이 만들어지는 쿼리. 정적인 쿼리는 where절에서 조금만 조건이 바뀌어도 새로운 쿼리문을 생성해야 한다.
- 동적인 쿼리 : where절의 조건이 다양하더라도 하나의 select문으로 커버될 수 있는 쿼리.

 

[동적 쿼리문 작성 방법]

1) sql 태그에 쿼리문 작성

- where 절 태그 처리

	// where 조건절을 태그로 처리
    <select id="getUserList01" parameterType="user" resultMap="userSelectRM">
		select
		user_id
		,user_name
		,password
		,age 
		,grade
		,reg_date
		from users
		<where>
			<if test="userName !=null">		//test안에 조건문 입력
				user_name LIKE #{userName}  
			</if>
			<if test="age !=null">
				or age LIKE #{age}		// or, and는 다음 if tag에서 입력
			</if>
		</where>
		order bY user_id DESC
	</select>

- select 출력 칼럼 태그 처리

# select 리턴 컬럼 태그처리
<sql id="select-users">
	select user_id,user_name,password,age,grade,reg_date from users
</sql>

- 정렬 조건문 태그 처리

# orderby 태그처리
<sql id="orderby-user_id-desc">
	ORDER BY user_id DESC
</sql>

 

2) include 태그로 삽입

	<select id="getUserList" parameterType="user" resultMap="userSelectRM">
		// 위에서 sql태그로 추출한 select문을 include로 삽입.
        // refid는 sql태그의 id로 지정
        <include refid="select-users"/>		
		<where>
			<if test="userName !=null">
				user_name LIKE #{userName}
			</if>
			<if test="age !=null">
				or age LIKE #{age}
			</if>
		</where>
		<include refid="orderby-user_id-desc"/>
	</select>	

'Web Programming > Spring' 카테고리의 다른 글

[Spring] BeanNameViewResolver  (0) 2020.08.10
[Spring] Annotation  (0) 2020.08.06
[Spring] Bean 설정문서  (0) 2020.08.06
[Spring] MyBatis Data Access  (0) 2020.08.04
[Spring] Core Container  (1) 2020.08.03

댓글