« Tapestry JavaScript(1) | メイン | iBatisでSELECT(2つのテーブルからデータ取得) »

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

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

ブログ内の関連する記事

トラックバック

このエントリーのトラックバックURL:
http://www.taosoftware.co.jp/mt/mt-tb.cgi/14

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)