GeneratedKeyを使う方法は以前書きましたが、今回はiBatisを使った場合の方法です。
1回の命令でシーケンスをエミュレートするやりかたを書いておきます。
まず、iBatisは以下の事が言えます。
- Insertの時だけSelectKeyで値を返すことができる(Updateの時は戻り値は更新件数)
- InsertタグでもUpdate文を発行する事は可能
(JDBCレベルではexecuteUpdateを発行しているため)
これらの事をふまえると、
Insertタグの中にUpdate文を記述して、SelectKeyも併せて書くことでインクリメントした値を返すことができます。
さっそくサンプルを。
シーケンステーブルの準備
CREATE TABLE SEQUENCE ( NAME VARCHAR(32) NOT NULL, SEQ INTEGER NOT NULL, CONSTRAINT PK_SEQUENCE PRIMARY KEY(NAME) ) Type=InnoDB; INSERT INTO SEQUENCE (NAME, SEQ) VALUES('IMGID', 0);
iBatisの設定ファイル
<insert id="GetNextSequence" parameterClass="java.lang.String"> UPDATE SEQUENCE SET SEQ = LAST_INSERT_ID(SEQ+1) WHERE NAME = #name# <selectKey resultClass="int"> SELECT LAST_INSERT_ID() </selectKey> </insert>
Javaプログラム
int id = (Integer) sqlMap.insert("GetNextSequence", "IMGID");
タムタム
今気がついたけど、sekectKeyのtype="post"にしないとダメな気がする。デフォルトって"pre"だったような。。