MyBatis | 동적 SQL | set, trim

DB 테이블

test_table

id string number
1 hoge 100
2 hoge 200
3 fuga 200
4 piyo 100

소스 코드

TestTable.java

package sample.mybatis;

public class TestTable {
    private int id;
    private String string;
    private Integer number;

    public TestTable id(int id) {
        this.id = id;
        return this;
    }

    public TestTable string(String string) {
        this.string = string;
        return this;
    }

    public TestTable number(int number) {
        this.number = number;
        return this;
    }
}

sample_mapper.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="sample.mybatis">

  <update id="updateTest">
    update test_table
    <set>
      <if test="string != null">
        string = #{string},
      </if>
      <if test="number != null">
        number = #{number},
      </if>
    </set>
    where id = #{id}
  </update>
</mapper>

Main.java

package sample.mybatis;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Main {

    public static void main(String[] args) throws Exception {
        try (InputStream in = Main.class.getResourceAsStream("/mybatis-config.xml")) {
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

            try (SqlSession session = factory.openSession()) {
                session.update("sample.mybatis.updateTest",
                        new TestTable().id(1).number(555));

                session.update("sample.mybatis.updateTest",
                        new TestTable().id(3).string("update").number(999));

                session.commit();
            }
        }
    }
}

실행 결과

[DEBUG] s.m.updateTest  - ==>  Preparing: update test_table SET number = ? where id = ? 
[DEBUG] s.m.updateTest  - ==> Parameters: 555(Integer), 1(Integer)
[DEBUG] s.m.updateTest  - <==    Updates: 1
[DEBUG] s.m.updateTest  - ==>  Preparing: update test_table SET string = ?, number = ? where id = ? 
[DEBUG] s.m.updateTest  - ==> Parameters: update(String), 999(Integer), 3(Integer)
[DEBUG] s.m.updateTest  - <==    Updates: 1
test_table

test_table

id string number
1 hoge 555
2 hoge 200
3 update 999
4 piyo 300

설명

  • 태그를 사용하면 내부 문자열이 비어 있지 않은 경우 앞에 SET 절이 추가된다.
  • 또한 끝에 쉼표 (,)가 자동으로 제거된다.

trim 태그로 대체

<where> 때와 마찬가지로 <trim>로 대체 할 수도 있다.

sample_mapper.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="sample.mybatis">

  <update id="updateTest">
    update test_table
    <trim prefix="set" suffixOverrides=",">
      <if test="string != null">
        string = #{string},
      </if>
      <if test="number != null">
        number = #{number},
      </if>
    </trim>
    where id = #{id}
  </update>
</mapper>
  • suffixOverrides 속성에 마지막에 제거하는 문자을 지정한다.