슬기로운 개발자 생활

[MyBatis] 등록 INSERT 본문

IT 개발/MyBatis

[MyBatis] 등록 INSERT

개발자 너부리 2017. 12. 31. 02:55
반응형

데이터 등록인 INSERT에 대해서 알아본다.


기본

소스 코드

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

  <insert id="insertTest">
    insert into test_table (
        value
    ) values (
        #{value}
    )
  </insert>
</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.insert("sample.mybatis.insertTest", "hoge");
                session.commit();
            }
        }
    }
}

실행 결과

[DEBUG] s.m.insertTest  - ==>  Preparing: insert into test_table ( value ) values ( ? ) 
[DEBUG] s.m.insertTest  - ==> Parameters: hoge(String)
[DEBUG] s.m.insertTest  - <==    Updates: 1

test_table

idvalue
1hoge

설명

  • <insert> 태그에서 INSERT 문을 정의할 수 있다.
  • 대체로 <select> 때와 같은 방식으로 정의할 수 있다.


객체를 매개 변수로 전달

소소 코드

TestTable.java

package sample.mybatis;

public class TestTable {
    private int id;
    private String value;

    public TestTable(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "TestTable [id=" + id + ", value=" + value + "]";
    }
}

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()) {
                TestTable table = new TestTable("fuga");

                session.insert("sample.mybatis.insertTest", table);
                session.commit();
            }
        }
    }
}

실행 결과

[DEBUG] s.m.insertTest  - ==>  Preparing: insert into test_table ( value ) values ( ? ) 
[DEBUG] s.m.insertTest  - ==> Parameters: fuga(String)
[DEBUG] s.m.insertTest  - <==    Updates: 1

test_table

idvalue
1hoge
2fuga

설명

  • 이쪽도 <select> 때와 같은 방식이다.
  • parameterType은 생략 가능하다.


자동 생성된 키값 얻기

소스 코드

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

  <insert id="insertTest" useGeneratedKeys="true" keyProperty="id">
    insert into test_table (
        value
    ) values (
        #{value}
    )
  </insert>

</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()) {
                TestTable table = new TestTable("piyo");

                session.insert("sample.mybatis.insertTest", table);
                session.commit();

                System.out.println(table);
            }
        }
    }
}

실행 결과

[DEBUG] s.m.insertTest  - ==>  Preparing: insert into test_table ( value ) values ( ? ) 
[DEBUG] s.m.insertTest  - ==> Parameters: fuga(String)
[DEBUG] s.m.insertTest  - <==    Updates: 1
TestTable [id=7, value=piyo]

test_table

idvalue
7piyo

설명

  • <insert> 태그에 useGeneratedKeys과 keyProperty를 지정한다.
    • useGeneratedKeys는 true를 지정한다.
    • keyProperty에 키 값을 설정하는 Java 측의 필드(속성) 이름을 지정한다.
  • 그러면 INSERT시에 데이터베이스에서 생성된 ID가 자동으로 Java의 인스턴스에 set 설정된다.

Oracle 시퀀스 오브젝트의 경우

ID를 시퀀스 객체로 부터 취득하는 경우는 다음과 같이 한다.

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

  <insert id="insertTest">
    <selectKey keyProperty="id" resultType="_int" order="BEFORE">
      select test_table_seq.nextval
        from dual
    </selectKey>
    insert into test_table (
        id
        ,value
    ) values (
        #{id}
        ,#{value}
    )
  </insert>
</mapper>

실행 결과

[DEBUG] s.m.insertTest!selectKey - ==>  Preparing: select test_table_seq.nextval from dual 
[DEBUG] s.m.insertTest!selectKey - ==> Parameters: 
[DEBUG] s.m.insertTest!selectKey - <==      Total: 1
[DEBUG] s.m.insertTest  - ==>  Preparing: insert into test_table ( id ,value ) values ( ? ,? ) 
[DEBUG] s.m.insertTest  - ==> Parameters: 11(Integer), aaa(String)
[DEBUG] s.m.insertTest  - <==    Updates: 1
TestTable [id=11, value=aaa]

확인

SQL> select * from test_table;

        ID VALUE
---------- -----
        11 aaa

설명

  • <insert> 태그안에 <selectKey> 태그를 선언한다.
  • keyProperty 속성에서 생성된 ID를 설정하는 Java 필드(속성) 이름을 지정한다.
  • order 속성에 BEFORE를 설정하여 우선 순서에서 값을 검색한 후에 INSERT가 실행되게 된다.


반응형
Tag
1 Comments
댓글쓰기 폼