Sequenceをエミュレート(MySQL+iBatis版)

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");
新しいサイトもよろしくお願いします!