DB - MyBatis

마이바티스에 대해 알아보자

Posted by Yan on June 1, 2022

MyBatis란?

  • 개발자가 지정한 SQL, 저장 프로시져, 고급 매핑 등을 지원하는 persistence Framework(데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들의 집합)
  • JDBC로 처리하는 상당 부분의 코드와 파라미터 설정, 결과 매핑을 대신 해줌
  • 데이터 레코드에 Primitive Type, Map interface, java POJO를 설정해서 매핑하기 위해 XML과 애노테이션 사용 가능

작업 순서

  1. 테이블 생성
  2. MyBatis 의존관계 등록
  3. MyBatis에서 제공하는 기능을 사용하기 위한 빈 등록 및 설정정보, Mapping.xml파일 생성
  4. DB 설정 Properties 생성
  5. 연결 테스팅

동적 SQL

  1. if
  2. choose (when, otherwise)
  3. trim (where, set)
  4. 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>
  • title과 author를 사용하여 검색

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 연동하기