33
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MyBatis3でINSERT時の自動採番されたIDを取りたい

Posted at

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を設定する)

以上。

33
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?