7
7

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.

MyBatisでauto_incrementされたPRIMAY KEYのidを取得する方法

Last updated at Posted at 2018-06-22

やりたいこと

insertしたデータのauto_incrementされたPKの値を使いたい。

結論

MyBatisGeneratorで自動生成されたMapperをちょっといじればOK。
ただし再度generateしたらリセットされてしまうので要注意。

こんなテーブル(MySQL)があったとする。

user.sql
CREATE TABLE user (
  user_id int(10) NOT NULL AUTO_INCREMENT,
  name varchar(30) NOT NULL,
  created_at datetime NOT NULL,
  updated_at datetime NOT NULL,
  PRIMARY KEY (user_id)
);

xmlを編集する

UserMapper.xmlのinsert id="insert"の部分を丸っとコピーしてauto_incrementされた値を返すinsert id="insertReturnId"を追加する。

UserMapper.xml
<!-- もともとある -->
<insert id="insert" parameterType="mypackage.dao.entity.User">
    insert into user (user_id, name, created_at, updated_at)
    values (#{userId,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, 
    #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP})
</insert>
<!-- これを追加する -->
<insert id="insertReturnId" parameterType="mypackage.dao.entity.User">
    insert into user (user_id, name, created_at, updated_at)
    values (#{userId,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, 
    #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP})
  <selectKey resultType="int" keyProperty="userId" order="AFTER">
      select @@IDENTITY
  </selectKey>
</insert>

ちなみにorderをBEFOREにするとinsert前の値、AFTERにするとinsert後の値が取れる。

もちろんもともとあるinsertのところに下記を追記しても良いが、あまりおすすめしません。

<selectKey resultType="int" keyProperty="userId" order="AFTER">
    select @@IDENTITY
</selectKey>

なぜならもともとある方のinsertもintの値(insertした件数)が返ってくるので、万が一編集したことを忘れてgenerateした場合、気付かない可能性があるから。
ちなみにinsert id="insertReturnId"を追加する方法なら、万が一忘れてgenerateした場合でもjava側で「メソッドがねぇ!」ってエラーになって気付くことができる。

Mapperクラスを編集する

UserMapper.xmlで指定したinsert id="insertReturnId"を追加する。

UserMapper.java
int insertReturnId(User record);

Java(SpringBoot)で使う

Serviceクラス

UserService.java
@Service
public class UserService {

    @Autowired
    UserMapper userMapper;

    public int createUser(String name) {
	User user = new User();
	user.setName(name);
	user.setCreatedAt(new Date());
	user.setUpdatedAt(new Date());

	// userのuserIdに auto_incrementされた値が入る
	userMapper.insertReturnId(user);
	
	return user.getUserId();
    }
}

Controllerクラス

UserController.java
@Controller
public class AuthController {

    @Autowired
    UserService userService;

    @RequestMapping(value = "/mypage")
    public String mypage(Model model) throws Exception {

        // auto_incrementされたuserIdが返ってくる
        int userId = userService.createUser("my name");

        model.addAttribute("userId", userId);

        return "mypage";
    }
}
7
7
2

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
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?