[SQL XML]
MyBatis에서는 SQL 쿼리문을 xml을 통해 MetaData로 만들어서 애플리케이션의 외부로 분리한다.
1. SQL XML 기본 작성방법
- resultMap
2. 값 주입
3. 정적 쿼리 / 동적 쿼리

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 |
댓글