Mybatis执行批量插入,能返回数据库主键列表吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在MyBatis中执行批量插入操作时,直接获取返回的数据库主键列表的功能并不直接内置。但您可以通过以下方式实现这一需求:
配置映射文件:首先确保您的Mapper XML文件中的插入语句配置了useGeneratedKeys="true"
以及设置了keyProperty
来指定实体类中用于接收生成主键值的属性。对于单条插入这很直接,例如:
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="userId">
INSERT INTO users(userName, height, score) VALUES (#{userName}, #{height}, #{score})
</insert>
但对于批量插入,MyBatis原生并不直接支持批量插入后立即获取所有生成的主键。
逐条插入并收集主键:如果需要批量插入的同时获取所有主键,一种可行的方法是改用循环单条插入,每次插入后通过SqlSession
的insert
方法(当配置了useGeneratedKeys="true"
)可以获取到单个插入后生成的主键,并收集这些主键到一个列表中。
自定义存储过程或SQL:另一种更高效的方式是利用数据库的特性,比如在MySQL中可以通过编写存储过程来实现批量插入并返回所有生成的主键,然后在MyBatis中调用这个存储过程。这样可以在数据库层面一次性完成批量操作并返回所需信息,但这种方式依赖于具体数据库的支持和额外的数据库编程工作。
后查询:如果数据库不支持通过批量插入直接返回主键列表,还可以采取先批量插入数据,然后执行一个查询来获取最后插入的那些记录的主键。这种方法的缺点是需要额外的查询开销,并且在高并发场景下可能因时间差导致数据不准确。
综上所述,虽然MyBatis本身对批量插入直接返回主键列表的支持有限,但通过上述变通方案,您可以根据实际需求和数据库特性选择合适的方法来实现这一功能。