iBATIS3 の <selectKey>

iBATIS3 から、<insert>の中に書く selectKey で、新規IDを受ける記述は、

    <selectKey keyProperty="id" type="post" resultClass="java.lang.Long">
    SELECT LAST_INSERT_ID() AS value
    </selectKey>

ではなく!
resultClass → resultType
type="post" →  order="AFTER"

に変更になり、以下のように、書く

<insert id="insertItem" parameterType="jp.aaa.entity.Item">
    INSERT INTO tblitem (name,price,buydate,refid)
    VALUES (#{name},#{price},#{buydate},#{refid})
  <selectKey keyProperty=”id” resultType="int" order="AFTER"  >
  SELECT LAST_INSERT_ID() AS value
  </selectKey>

</insert>

iBATIS2 の時のように、SqlMapClient#insert メソッドの戻り値で新規ID が返ってくるのではなく、
iBATIS3 では、SqlSession#insert(sqlmapperId,obj); の戻り値は挿入結果行数であって、
insertのパラメータ=オブジェクトで、keyProperty 名で宣言したフィールドに入ってくる。

上の例なら、jp.aaa.entity.Item クラスの挿入Object インスタンスの long id; フィールド
に入ってくる。

ただし、注意すべきことがある。SqlSession を生成する時に、
SqlSessionFactory#openSession(ExecutorType.BATCH,false)
で、生成していると、SQLバッチ実行ということで、このidは、返ってこない。


メソッドの引数として渡した物に、勝手に入ってくるのでちょっと違和感を持ったが
コーディングのステップが減らすことができる。