MyBatis的useGeneratedKeys使用(添加并返回自增主键)

业务需求,用户表为主键自增,添加完用户之后,通过用户ID和角色表进行关联。

问题:由于主键自增,所以在用户添加之前是不知道ID的,当然可以通过查询得到当前的ID,不过需要自己多一步操作。

解决方案:使用useGeneratedKeys属性,以及keyProperty

useGeneratedKeys

(仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false

keyProperty

仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。

个人理解:下图比较详细

 

 

 可能引发问题:有时候使用批量添加操作,在service层将所有的数据通过for循环进行遍历,调用底层的单个添加操作的方法(xml中useGeneratedKeys属性为true),添加到第二条时,会提示主键已存在的异常(数据库设置的为主键自增)。

 原因:因为useGeneratedKeys属性为true所以将第一条添加的数据主键返回了,而第二条数据没有将id主键重新设置为null,直接使用第一条添加数据并返回的主键id,导致主键重复异常。

 解决方案:循环遍历添加时,将id设置为null即可。

for (int i = 0; i < 3; i++) {
       user.setUserId(null);  //将用户id重新设置为null即可
       // 新增用户信息
       rows = userMapper.insertUser(user);
       // 新增用户岗位关联
       insertUserPost(user);  
}

 

posted @ 2021-08-27 11:20  背着泰山找黄河  阅读(1670)  评论(0编辑  收藏  举报