마이바티스(MyBatis) 실무활용
프로젝트 개발을 진행하다 보면 상당히 많이 사용하고 있음에도 평소에 습관처럼 복붙 해서 쓰는 경우가 많아
정리할 겸 포스팅한다. 이내용을 이해하게 된다면 실무에서 적용하기에 크게 어렵지 않을 것이다.
다오 또는 매퍼명을 적어주면 해당하는 메서드명으로 ID를 찾아서 실행해준다.
<mapper namespace="test.master.extentionMapper">
쿼리 태그
<select>
<insert>
<update>
쿼리 구문에 맞게 맞춰서 쓰면 된다.
insert 구문 앞에 오는 seletKey
<selectKey keyProperty="Sequence" resultType="Integer" order="BEFORE">
SELECT IFNULL(MAX(PAYMENT_SEQUENCE), 0) + 1
FROM MENT
WHERE ORDER_CODE = #{Code}
AND ORDER_SEQUENCE = #{Sequence}
</selectKey>
시퀀스를 DB에서 만들어서 쓴다면 SeqNm.nextVal로 쓸 수 있지만 아직도 많은 프로젝트에서
max+1을 적용해서 많이 사용하고 있다.
이때 서브 쿼리에 해당 쿼리를 써줘도 되지만 이 방법이 더 깔끔하고 간편하다.
유의해서 사용해야 할 CDATA
CDATA 같은 경우 > < 등 부등호 처리 할 때 태그로 처리되는 부등호를
쿼리에서 인식하게 바꿔주는 역할을 한다.
하지만 유의해야 할 점이 동적 태그를 CDATA로 감싸면 인식 안되기 때문에 이 부분 유의해서 써준다.
쿼리 내용 포함하는 include 태그
<include refid="CommonMapper.paginationHeader" />
-쿼리를 불러서 포함시키는 태그인데 매퍼 Name.ID로 불러서 쓸 수 있다.
여러 가지 공통된 쿼리 내용을 포함시켜야 할 때 많이 쓴다.
결과을 담는 resultMap
<resultMap id="masterResult" type="master.test.domain.masterVO">
<result property="voName" column="colName" />
<result property="eventCode" column="EVENT_CODE" />
<collection property="attendanceConfigs" resultMap="AttendanceConfigResult" />
</resultMap>
resultMap="masterResult"
resultMap으로 결과값을 VO에 매핑시킬 수 있다.
다른 테이블과 1대다 관계에 있고 다쪽 데이터를 매핑시킬 때는 List 형태로 받아서 매핑시켜야 하는데
이때는 collection형태로 담아야 한다.
리저트 맵으로 리저트타입을 넘길 때 resultTyㅃpe="masterResult"로 선언해주면 에러가 난다.
resultMap으로 선언된 결과값은 resultMap="masterResult"로 처리해야 에러 없이 실행될 것이다.
쿼리 태그 옵션 값
-parameterType,
파라미터로 넘어 오는 변수를 자바 객체, 기본형을 써줄 수 있다
VO
int
String [한 칼럼의 경우 스트링 배열로 받을 수 있다.]
list
map
list 추가 설명
INSERT MASG ( ID
,STATUS
,PHONE
,CALLBACK
,REQDATE
,MSG
,TEMPLATE_CODE
,FAILED_TYPE
,FAILED_SUBJECT
,FAILED_MSG
,PROFILE_KEY
,BUTTON_JSON )
VALUES
<foreach collection="list" item="masg" open="" close="" separator=",">
( #{masg.id}
,'0'
,#{masg.phone}
,#{masg.callback}
,NOW()
,#{masg.msg}
,#{masg.templateCode},
,#{masg.failedType}
,#{masg.failedSubject}
,#{masg.failedMsg}
,#{masg.profileKey}
,#{masg.buttonJson} )
</foreach>
이런 식으로 루프 문을 돌려서 다량의 데이터를 추가시킬 수 있다.
-resultType
결과값은 map,list,VO,int,string, 등으로 넘길 수 있다
유의할 점은 VO의 경우 선언된 멤버 변수 기준으로 #{변수명}으로 적어야 하고
map은 키값 기준으로 int, string은 넘길 때 변수명 기준으로
매퍼에서 받아와야 정상적으로 쓸 수 있다.
동적 태그
-IF태그
<if test='displayFlag != null and displayFlag != ""'>
AND DISPLAY_FLAG = #{displayFlag}
</if>
-choose태그
<choose>
<when test="orderCode != null and orderCode != ''">
AND ORDER_CODE = #{orderCode}
</when>
<when test="orderCode == "100" >
AND ORDER_CODE = '100'
</when>
<otherwise>
AND USER_ID = #{userId}
</otherwise>
</choose>
when조건 둘 다 안 맞을 시 otherwise실행.
-foreach태그
<foreach collection="list" item="item" index="i" open="(" separator="OR" close=")">
CODE = #{item.orderCode}
AND QUENCE = #{item.orderSequence}
AND SEQUENCE = #{item.itemSequence}
AND STATUS = '01'
</foreach>
<foreach collection="status" item="status" index="i" open="(" separator="," close=")">
#{status}
</foreach>
코드를 보면 대부분 알 것 같다.
item 결과값을 담는 변수
index는 값이 들어올 때마다 0부터 순차적으로 증가한다
open 구문 시작 시 들어가는 문자열
close 구문 끝날 시 들어가는 문자열
separator 한번 돌고 다음번에 오는 구분자