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時に自動採番した値を利用するケースは多いと思いますので、覚えておくとよいのではないでしょうか。
コメント
コメントを投稿