iBatisを使ってINSERTを行う際に、自動採番で採番された情報をINSERTのパラメータとして利用し、
かつ、その採番した値を取得する方法について説明します。

環境は「iBatisでSELECT」と同様ですが、Postgresを利用しているので、自動採番用で利用するシーケンスの作成をしておきます。

CREATE SEQUENCE userid_seq
START 1000

START で1000を指定していますが、ただ単にこれまでINSERTしてきたデータよりも大きい値を設定しておきたかったためです。


「iBatisでINSERT,UPDATE,DELETE」と変わる場所は、マッピングファイルと、実行部分です。

マッピングファイル

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<select id="getUser" resultClass="sample.iBatis.User">
SELECT
ID AS id,
NAME AS name
FROM USER_TABLE
WHERE ID=#value#
</select>
<insert id="insertUser" parameterClass="sample.iBatis.User">
    <selectKey resultClass="java.lang.Long" keyProperty="id">
SELECT NEXTVAL('userid_seq')
</selectKey>

INSERT INTO USER_TABLE
(ID, NAME)
VALUES (#id#, #name#)
</insert>
<update id="updateUser" parameterClass="sample.iBatis.User">
UPDATE USER_TABLE
SET NAME=#name#
WHERE ID=#id#
</update>
<delete id="deleteUser" parameterClass="sample.iBatis.User">
DELETE FROM USER_TABLE
WHERE ID=#id#
</delete>
</sqlMap>

insertタグの中ににselectKeyというタグを追加しました。
この部分が今回の目的である自動採番の値をINSERT時のパラメータに使うおまじない。

selectタグの各属性については以下の通りです。

属性 内容
resultClass 取り出す値の型。insertタグのparameterClassのプロパティとあわせておく必要あり
keyProperty 実行結果を入れるためのプロパティ名

ここまでで、準備は完了で、あとは、実行するためのクラスだけです。

package sample;
import java.io.Reader;
import sample.iBatis.User;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class TestMain {
public static void main(String[] args) throws Exception {
String RESOURCE_FILE = "mappings/sql-map-config.xml";
Reader reader = Resources.getResourceAsReader(RESOURCE_FILE);
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
// INSERT
User newUser = new User();
newUser.setName("TEST USER");
Long userId = (Long)sqlMap.insert("insertUser", newUser);
System.out.println(newUser);
System.out.println("[ret id :"+userId+"]");
}
}

実行するとコンソールには、
ID[1001]:Name[TEST USER]
[ret id :1001]
と表示されます。
つまり、SELECT NEXTVAL(‘userid_seq’)を実行した結果をIDに設定して、INSERTが行われるということになります。
また、selectKeyで指定した結果が、sqlMap.insertの戻り値として返されるということになります。

INSERT時に自動採番した値を利用するケースは多いと思いますので、覚えておくとよいのではないでしょうか。

ブログ内の関連する記事