iBatisでINSERT(自動採番値の利用)
iBatisを使ってINSERTを行う際に、自動採番で採番された情報をINSERTのパラメータとして利用し、
かつ、その採番した値を取得する方法について説明します。
環境は「iBatisでSELECT」と同様ですが、Postgresを利用しているので、自動採番用で利用するシーケンスの作成をしておきます。
START で1000を指定していますが、ただ単にこれまでINSERTしてきたデータよりも大きい値を設定しておきたかったためです。
環境は「iBatisでSELECT」と同様ですが、Postgresを利用しているので、自動採番用で利用するシーケンスの作成をしておきます。
CREATE SEQUENCE userid_seq START 1000
START で1000を指定していますが、ただ単にこれまでINSERTしてきたデータよりも大きい値を設定しておきたかったためです。
「iBatisでINSERT,UPDATE,DELETE」と変わる場所は、マッピングファイルと、実行部分です。
マッピングファイル
insertタグの中ににselectKeyというタグを追加しました。
この部分が今回の目的である自動採番の値をINSERT時のパラメータに使うおまじない。
selectタグの各属性については以下の通りです。
ここまでで、準備は完了で、あとは、実行するためのクラスだけです。
実行するとコンソールには、
ID[1001]:Name[TEST USER]
[ret id :1001]
と表示されます。
つまり、SELECT NEXTVAL('userid_seq')を実行した結果をIDに設定して、INSERTが行われるということになります。
また、selectKeyで指定した結果が、sqlMap.insertの戻り値として返されるということになります。
INSERT時に自動採番した値を利用するケースは多いと思いますので、覚えておくとよいのではないでしょうか。
マッピングファイル
<?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時に自動採番した値を利用するケースは多いと思いますので、覚えておくとよいのではないでしょうか。


