やりたいこと
insertしたデータのauto_incrementされたPKの値を使いたい。
結論
MyBatisGeneratorで自動生成されたMapperをちょっといじればOK。
ただし再度generateしたらリセットされてしまうので要注意。
例
こんなテーブル(MySQL)があったとする。
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"
を追加する。
<!-- もともとある -->
<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"
を追加する。
int insertReturnId(User record);
Java(SpringBoot)で使う
Serviceクラス
@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クラス
@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";
}
}