tl;dr
- AUTO INCREMENTやシーケンスなどで自動採番されたID値は、
useGeneratedKeys="true"
を使ったり、<SelectKey>
でSQLを実行したりすると取得できる - ID値は
keyProperty
の値を基に、引数に渡したオブジェクトに対してマッピングされる - 戻り値の数値は「Insertした件数」や「Updateした件数」となる。(IDではない)
背景
Insertによって生成されたIDを使い、色々したいことは間々あります。
調べると出ますが、どのようにして得られるのかを書いてなかったり、戻り値で得るみたいな記事を見かけたりして混乱したのと、ドキュメントにはちゃんと書いてあるけど、MapperのXMLしか出てなくて、コードでイメージできなかったので。
http://www.mybatis.org/mybatis-3/ja/sqlmap-xml.html#insert_update_and_delete
以下のstackoverflowの投稿でやっと使い方を理解できた。問題解決能力の低さよ。
https://stackoverflow.com/a/20954027
不明点
- IDを得る方法は引数のオブジェクトにマッピングさせるしかない?(個人的には戻り値にしたい。)
実例
以下のようなClass,Interface,MapperXMLを用意します
User.java
package jp.co.neosystem.fukasawah.myapp.db.entity;
public class User {
long id;
String name;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
UserMapper.java
package jp.co.neosystem.fukasawah.myapp.db.mapper;
import jp.co.neosystem.fukasawah.myapp.db.entity.User;
public interface UserMapper {
/* Userクラスを引数に取るようにする。IDをマッピングするため必要 */
int insert(User user);
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jp.co.neosystem.fukasawah.myapp.db.mapper.UserMapper">
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO User (NAME) values (#{name})
</insert>
</mapper>
Logic.java
/* 中略 */
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setName("foo");
int count = userMapper.insert(user);
// keyProperty="id"により、setIdを使ってマッピングされる。
// そのため、user.getId() で得られる。
System.out.println("insert user (user.getId()): "+ user.getId());
keyProperty
: 今回はid
を指定する。(MyBatisはこの値を見てUser#setId
を使うことを決定し、IDを設定する)
以上。