iBatisでINSERT(自動採番値の利用)

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

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

CREATE SEQUENCE userid_seqSTART 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">SELECTID AS id,NAME AS nameFROM USER_TABLEWHERE 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_TABLESET NAME=#name#WHERE ID=#id#</update><delete id="deleteUser" parameterClass="sample.iBatis.User">DELETE FROM USER_TABLEWHERE 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);// INSERTUser 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時に自動採番した値を利用するケースは多いと思いますので、覚えておくとよいのではないでしょうか。

ブログ内の関連する記事


コメント

このブログの人気の投稿

島へ移住の話【炊飯】

ドローンプログラミング体験教室を伊豆大島の小学校でしてきました

情報処理安全確保支援士登録証のカード型が届きました。