본문 바로가기

Framework

[Dynamic Query] iBatis와 MyBatis 차이점

개발하면서 SQL Mapper로 사용하는 iBatis, MyBtis 태그를 간략히 정리해 보았다.

 

더보기

iBatis와 MyBtis는 Persistence Framework(데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들의 집합)로, JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있으며 안정적인 구동도 보장해준다. - wikipedia

 

예시

: member 테이블에서 20살 이상의 성인 회원이며 서울에 사는 회원 50명의 리스트를 불러온다고 가정해보자. 

 

IBATIS

<sqlMap namespace="ibatisDAO">

  <!-- paging start -->
  <sql id="pageStart">
      <![CDATA[
          SELECT * FROM(
              SELECT
                  ROWNUM AS RNUM,
                  ALLDATA.*
              FROM(
      ]]>
  </sql>	


  <!-- paging end -->
  <sql id="pageEnd">
      <![CDATA[
              ) ALLDATA
          ) ALLDATA
          WHERE RNUM BETWEEN #startIndex# AND #endIndex#
          ORDER BY RNUM ASC	
      ]]>
  </sql>	


  <select id="getMemberList" parameterClass="java.lang.String" resultClass="resultMap">

      <include refid="pageStart" />	

          <![CDATA[
              SELECT *
              FROM MEMBER
              WHERE age >= 20
          ]]>

          <dynamic prepend="WHERE">
              <isNotEmpty property ="address1">
                  address1 = #address1#
              </isNotEmpty>
          </dynamic>

      <include refid="pageEnd" />

  </select>

</sqlMap>

 

MyBatis

<mapper namespace="com.hwang.tree.MybatisMapper">

  <!-- paging start -->
  <sql id="pageStart">
      <![CDATA[
          SELECT * FROM(
              SELECT
                  ROWNUM AS RNUM,
                  ALLDATA.*
              FROM(
      ]]>
  </sql>	


  <!-- paging end -->
  <sql id="pageEnd">
      <![CDATA[
              ) ALLDATA
          ) ALLDATA
          WHERE RNUM BETWEEN #startIndex# AND #endIndex#
          ORDER BY RNUM ASC	
      ]]>
  </sql>	


  <select id="getMemberList" parameterType="java.lang.String" resultType="resultMap">

      <include refid="pageStart" />	

          <![CDATA[
              SELECT *
              FROM MEMBER
              WHERE age >= 20
          ]]>

          <where>
              <if test='address1 != "" '>
                  address1 = #{address1}
              </if>
          </where>

      <include refid="pageEnd" />

  </select>

</mapper>

 

ibatis를 사용했을 때와 mybatis를 사용했을 때 어떻게 작성하는지 큰 차이점 위주로 간단히 적어보았다. 

두 코드를 비교해보면 어떤 것들이 바뀌었는지 알 수 있다.

iBatis MyBatis
<sqlMap> <mapper>
parameterMap, parameterClass parameterType
resultClass resultType
#value# #{value}
<dynamic prepend="WHERE"> <where>
<isNotEmpty> <if test="조건문">

그 외 차이점

iBatis MyBatis
com.ibatis.* org.apache.ibatis.*
SqlMapConfig Configration
sqlMapClient sqlSession
rowHandler resultHandler
resultHandler SqlSessionFactory
$value$ ${value}
<isEqual>, <isNotEqual> , <isNull>, <isNotNull>, 등등 <if test="조건문">
  여러 조건의 경우 : <choose>, <when>, <otherwise>
<iterate> <foreach>

추가적인 차이점들이 더 있으니 필요한 것은 그때그때 찾아보면 좋을 것이다.

 

 

tip

  • <sql id="sameName"></sql>와 <include refid="sameName"/>를 사용하면 반복되는 쿼리를 바깥에 작성하여 공통으로 사용할 수 있다. 
  • <![CDATA[   ....코드....   ]]>로 감싸주면 안에 들어간 특수문자를 문자열로 인식해준다. *나 <=같은 비교연산자를 사용하는 경우에 문제를 해결할 수 있다.
  • #{} 와 ${}의 차이점 : https://logical-code.tistory.com/25 (너무 잘 설명해놓아서 첨부)

 




 

 

'Framework' 카테고리의 다른 글