useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 (仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。 |
keyProperty | (仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset )。如果生成列不止一个,可以用逗号分隔多个属性名称。 |
使用两个属性的insert语句可以将自增的主键id返回
问题:但是在批量插入的时候,我就发现了不能返回
答案:多行插入和生成id,列表名必须是list,可以默认或者指定,但是必须是list
========>
MyBatis有多行插入和使用生成密钥的问题。 Bug是列表变量名称必须是“列表”,当执行批量插入并获取生成的密钥时。然后相应地访问该对象。因此,对于上述emxample代码将是这样的:
<insert id="batchInsert" parameterType="list" useGeneratedKeys="true" keyProperty="obj2.id">
<!-- obj2 is the object with variable id to store generated key -->
insert into object2 (value) values
<foreach collection="list" item="obj1" separator=",">
(#{obj1.obj2.id})
</foreach>
和mapper.java方法的声明看起来是这样:
public Integer batchInsert(@Param("list")List<Obj1> obj1);
变量的名称必须是列表 。没有其他的。