MyBatis란?
- 개발자가 지정한 SQL, 저장 프로시져, 고급 매핑 등을 지원하는 persistence Framework(데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들의 집합)
- JDBC로 처리하는 상당 부분의 코드와 파라미터 설정, 결과 매핑을 대신 해줌
- 데이터 레코드에 Primitive Type, Map interface, java POJO를 설정해서 매핑하기 위해 XML과 애노테이션 사용 가능
작업 순서
- 테이블 생성
- MyBatis 의존관계 등록
- MyBatis에서 제공하는 기능을 사용하기 위한 빈 등록 및 설정정보, Mapping.xml파일 생성
- DB 설정 Properties 생성
- 연결 테스팅
동적 SQL
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
if
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
- title이 null이라면 ACTIVE상태의 TITLE을 반환. title이 null이 아니라면 모든 #{title}과 비슷한 값을 가진 title 반환
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
choose
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
- 자바의 switch문과 비슷함
- title만으로 검색하고 author가 있다면 그 값으로 검색
- 둘 다 없다면 featured가 1인 blog 반환
trim, where, set
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
<where></where>
와 WHERE
를 사용하는 것의 차이점
WHERE
뒤에 이어지는 <if></if>
에 충족되는 조건이 없으면 WHERE
로 쿼리가 마무리되어 문법 오류가 발생
<where></where>
를 사용하면 <if></if>
에 충족되는 조건이 없을 시 WHERE
로 쿼리가 마무리되는 것이 아니라 문법 오류가 나지 않도록 구문을 마무리함
foreach
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
<where>
<foreach item="item" index="index" collection="list"
open="ID in (" separator="," close=")" nullable="true">
#{item}
</foreach>
</where>
</select>
- collection에 대한 반복 처리
- 엘리먼트 내부에서 사용할 수 있는
item
, index
두 가지 변수를 선언
reference
Mybatis
Spring MVC- MyBatis 연동하기