Spring Framrwork

Mybatis include sql

gregorio 2018. 3. 23. 10:34

Mybatis에서 Paging 처리 등 공통적으로 사용되는 SQL을 작성한 후 SQL File에서 Include하여 사용하면 개발의 생산성을 향상할 수 있다.


시스템에서 공통적으로 사용하는 SQL을 /resources/sqlmap 폴더에 common 폴더를 생성한 후 commonSQL.xml 파일을 생성한다.


■ commonSQL.xml

<?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">

<mapper namespace="common.sql">


<sql id="pageHeader">

SELECT *

  FROM (

    SELECT ROWNUM AS RN

   ,INNER_SQL.*

  FROM (

</sql>

<sql id="pageFooter">

<![CDATA[

                 ) INNER_SQL

           WHERE ROWNUM <= ( #{curPage} * #{pageSize} )

      )

    WHERE RN > ( ( #{curPage} -1 ) * #{pageSize} )

]]>

</sql>


<sql id="batchpageOffset">

<![CDATA[

    OFFSET ( #{_page} * #{_pagesize} ) ROWS FETCH NEXT #{_pagesize} ROWS ONLY

]]>

</sql>


       <!-- Paging Oracle 12C 이상 -->

<sql id="onlinepageOffset">

<![CDATA[

    OFFSET ( ( #{curPage} -1 ) * #{pageSize} ) ROWS FETCH NEXT #{pageSize} ROWS ONLY

]]>

</sql>


</mapper>


SQL 파일 작성이 완료되면 실제 업무 SQL에서 include를 이용하여 해당 sql을 사용할 수 있다.



■ 적용 예

<select id="selAPUserListPopup" parameterType="java.util.HashMap" resultType="egovMap">

SELECT /* selAPUserListPopup */ 

       A.USER_ID

      ,A.ORG_CD

FROM   AP_USER A

    WHERE  1 = 1

    <if test = 'userId != null and userId != ""'>

AND    A.USER_ID = #{userId, jdbcType=VARCHAR}

</if>

    ORDER BY UP_DT DESC

<include refid="common.sql.pageOffset"/>

</select> 


해당 SQL에 include refid(Reference Id)를 commonSQL의 namespace이름과 sql id를 사용하여 Include하면 SQL 실행 시 해당 파일이 Include되어 실행된다.