Spring + MyBatisの@Optionsアノテーションでサロゲートキーを取得する方法

Spring + MyBatisの@Optionsアノテーションでサロゲートキーを取得する方法

前提

src/main/resources配下にschema.sqlを配置します。中身は以下の通りとします。(ID列はAUTO_INCREMENTしていること)

CREATE TABLE IF NOT EXISTS employee (
  id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(60) NOT NULL,
  age BIGINT NOT NULL
);
CREATE SEQUENCE IF NOT EXISTS SEQ_ID;

Spring スタータープロジェクトで選択する依存関係は以下の通りとします。

Spring + MyBatisの@Selectアノテーションの使い方

@Mapperアノテーションを付与したインタフェースのメソッドに、@Insertアノテーションを付与します。

@InsertアノテーションにはSQL文を記述します。

従業員を表すPOJOです。

package jp.co.confrage.entity;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
@AllArgsConstructor
public class Employee {
  private Long id;
  private String name;
  private Integer age;
}

従業員テーブルを操作するマッパーインタフェースです。insertメソッドの引数にPOJOのインスタンスを渡します。

@OptionsアノテーションのuseGeneratedKeys,keyProperty,keyColumnはインサートかアップデートの時のみ使えるプロパティです。

package jp.co.confrage.repository;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;

import jp.co.confrage.entity.Employee;
@Mapper
public interface EmployeeMapper {
  @Insert("insert into employee (name,age) values (#{emp.name}, #{emp.age})")
  @Options(useGeneratedKeys = true, keyProperty = "emp.id", keyColumn = "id")
  int insert(@Param("emp") Employee employee);
}

@Mapperアノテーションを付与することで、DIが可能になります。

REST Controllerです。

package jp.co.confrage.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import jp.co.confrage.repository.EmployeeMapper;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@RestController
public class DemoController {
  private final EmployeeMapper employeeMapper;

  @GetMapping("/sample")
  public String sample() {
    final var emp = new Employee(null, "yamada", 35); // この時点でIDはnull
    final var result = employeeMapper.insert(emp);
    // この時点でIDはSEQUENCEオブジェクトのnextvalが設定されている
    System.out.println(result); // insert件数
    return "sample";
  }
}

Spring Bootアプリケーションを起動し、curlコマンドを実行します。

curl -X GET http://localhost:8080/sample

以下が標準出力されます。

1
MyBatis – MyBatis 3 | Java API

コメント

タイトルとURLをコピーしました