SQL 맵퍼 파일 작성
MyBatis의 가장 중요한 목적 중 하나는 DAO에서부터 SQL을 분리하는 것이다. <select>, <insert>, <update>등 다양한 엘리먼트를 사용해서 맵퍼 파일을 작성한다. SQL 맵퍼 파일은 XML이기 때문에 XML 선언이 가장 먼저 온다.
<?xml version="1.0" encoding="UTF-8">
그 다음으로는 태그 규칙을 정의한 DTD 선언이 온다.
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
1.<mapper> 루트 엘리먼트
SQL 맵퍼 파일은 루트 엘리먼트 <mapper>를 작성하는 것으로 시작한다. <mapper> 태그의 namespace 속성은 SQL문을 묶는 용도로 사용한다. 맵퍼 파일에 작성하는 모든 SQL 문은 <mapper> 태그에 놓인다.
<mapper namespace="spms.dao.ProjectDao">
...
</mapper>
2.<select>, <insert>, <update>, <delete> 엘리먼트
SQL 문을 작성할 때 명령어에 따라 사용하는 태그가 다르다. SELECT 문은 <select> 태그에 작성하고, INSERT 문은 <insert>, UPDATE 문은 <update>, DELETE 문은 <delete> 태그를 사용하여 작성한다.
<select ...>
select PNO, PNAME, STA_DATE, END_DATE, STATE
...
</select>
<insert ...>
insert into PROJECTS(PNAME, CONTENT, STA_DATE, END_DATE, STATE, CRE_DATE, TAGS)
...
</insert>
2-1 id 속성
SQL 문을 작성할 때 각각의 SQL 문을 구분하기 위해 id 속성을 사용한다.
<select id="selectList" ...> ... </select>
<insert id="insert" ...> ... </insert>
<select id="selectOne" ...> ... </select>
<update id="update" ...> ... </update>
<delete id="delete" ...> ... </delete>
2-2 resultType 속성
SELECT 문을 실행하면 결과가 생성되는데, 이 결과를 담을 객체를 지정하는 속성이 resultType이다. resultType은 클래스 이름(패키지 이름 포함)이 온다.
<select id="selectList" resultType="spms.vo.Project">
3.<resultMap> 엘리먼트
칼럼 이름과 셋터 이름이 불일치 하다면 <resultMap>을 이용하면 일치 시킬 수 있다.
<resultMap type="project" id="projectResultMap">
<id column="PNO" property="no"/>
<result column="PNAME" property="title"/>
<result column="CONTENT" property="content"/>
<result column="STA_DATE" property="startDate" javaType="java.sql.Date"/>
...
</resultMap>
4.<result> 엘리먼트
<resultMap> 태그의 자식 태그로서 칼럼과 셋터 메서드의 연결을 정의한다. <result> 태그를 살펴보면 column 속성에는 칼럼 이름을 지정하고, property 속성에는 객체의 프로퍼티 이름을 지정한다.
<result column="PNAME" property="title"/>
4-1 javaType 속성
<result>에서 javaType을 사용하면, 칼럼의 값을 특정 자바 객체로 변환할 수 있다.
<result column="STA_DATE" property="startDate" javaType="java.sql.Date"/>
동적 SQL
SQL을 실행하다 보면 상황에 따라 SQL문을 변경해야 할 경우가 있다. 이를 위해 MyBatis에서는 동적 SQL을 제공한다.
동적 SQL 엘리먼트
동적 SQL을 실행하기 위해 MyBatis는 다양한 엘리먼트를 제공한다
엘리먼트 | 설명 |
<if test="조건">SQL 문</if> | <if> 태그는 어떤 값의 상태를 검사하여 참일 경우에만 SQL문을 포함하고 싶을 때 사용한다. test 속성에 지정된 조건이 참이면 <if> 태그의 내용을 반환한다. |
<choose> <when test="조건1">SQL 문</when> <when test="조건2">SQL 문</when> <otherwise>SQL 문</otherwise> </choose> |
<choose> 태그는 검사할 조건이 여러 개일 경우에 사용한다. test 속성에 지정된 조건이 참이면 <when> 태그의 내용을 반환한다. 일치하는 조건이 없으면 <otherwise>의 내용을 반환한다. |
<where> <if test="조건1">SQL 문</when> <if test="조건2">SQL 문</when> </when> |
<where> 태그는 WHERE 절을 반환한다. <where> 안의 하위 태그를 실행하고 나서 반환값이 있으면 WHERE 절을 만들어 반환하고, 없으면 WHERE 절을 반환하지 않는다. |
<trim prefix="단어" prefixOverrides="문자열 | 문자열"> <if test="조건1">SQL 문</when> <if test="조건2">SQL 문</when> </trim> |
<trim> 태그는 특정 단어로 시작하는 SQL 문을 반환하고 싶을 때 사용한다. prefix는 반환값 앞에 붙일 접두어를 지정한다. prefixOverrides는 반환할 값에서 제거해야 하는 접두어를 지정한다. |
<set> <if test="조건1">SQL 문</when> <if test="조건2">SQL 문</when> </set> |
<set> 태그는 UPDATE 문의 SET 절을 만들 때 사용한다. 조건이 참인 <if>의 내용은 SET 절에 포함된다. SET 절의 항목이 여러 개일 경우 자동으로 콤마(,)를 붙인다. |
<foreach item="항목" index="인덱스" collection="목록" open="시작문자열" close="종료문자열" separator="구분자" </foreach> |
<foreach> 태그는 목록의 값을 가지고 SQL 문을 만들 때 사용한다. 특히 IN(값, 값, ...) 조건을 만들 때 좋다. item 속성에는 항목을 가리킬 때 사용할 변수의 이름을 지정한다. index 속성에는 항목의 인덱스 값을 꺼낼 때 사용할 변수 이름을 지정한다. collection 속성에는 java.util.list 구현체나 배열 객체가 온다. open 속성에는 최종 반환값의 접두어를 지정한다. close 속성에는 최종 반환값의 접미어를 지정한다. separator 속성은 반복으로 생성하는 값을 구분하기 위해 붙이는 문자열을 지정한다. |
<bind name="변수명" value="값"/> | <bind> 태그는 변수를 생성할 때 사용한다. |
출처:MVC아케틱처, 마이바티스, 스프링으로 만드는 실무형 개발자 로드맵 자바 웹 개발 워크북(저자: 엄진영, 출판사:프리렉)
'MyBatis' 카테고리의 다른 글
[MyBatis] MyBatis의 개념과 활용 (0) | 2022.03.10 |
---|