JAVA

마이바티스(MyBatis) 실무활용

undefineds 2020. 6. 24. 15:00

프로젝트 개발을 진행하다 보면 상당히 많이 사용하고 있음에도 평소에 습관처럼 복붙 해서 쓰는 경우가 많아

정리할 겸 포스팅한다.  이내용을 이해하게 된다면 실무에서 적용하기에 크게 어렵지 않을 것이다. 

 

다오 또는 매퍼명을 적어주면 해당하는 메서드명으로 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 한번 돌고 다음번에 오는 구분자