Mybatis批量插入返回插入成功后的主键id操作

 更新时间:2021年03月30日 10:13:56   作者:蒋老湿  
这篇文章主要介绍了Mybatis批量插入返回插入成功后的主键id操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我们都知道Mybatis在插入单条数据的时候有两种方式返回自增主键:

1、对于支持生成自增主键的数据库:增加 useGenerateKeys和keyProperty ,<insert>标签属性。

2、不支持生成自增主键的数据库:使用<selectKey>。

但是怎么对批量插入数据返回自增主键的解决方式网上看到的还是比较少,至少百度的结果比较少。

Mybatis官网资料提供如下:

First, if your database supports auto-generated key fields (e.g. MySQL and SQL Server), then you can simply set useGeneratedKeys="true" and set the keyProperty to the target property and you're done. For example, if the Authortable above had used an auto-generated column type for the id, the statement would be modified as follows:

<insert id="insertAuthor" useGeneratedKeys="true"
 keyProperty="id">
 insert into Author (username,password,email,bio)
 values (#{username},#{password},#{email},#{bio})
</insert>


 id="insertAuthor" useGeneratedKeys="true"
 keyProperty="id">
 insert into Author (username,password,email,bio)
 values (#{username},#{password},#{email},#{bio})
</insert>

If your database also supports multi-row insert, you can pass a list or an array of Authors and retrieve the auto-generated keys.

<insert id="insertAuthor" useGeneratedKeys="true"
 keyProperty="id">
 insert into Author (username, password, email, bio) values
 <foreach item="item" collection="list" separator=",">
 (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
 </foreach>
</insert>


 id="insertAuthor" useGeneratedKeys="true"
 keyProperty="id">
 insert into Author (username, password, email, bio) values
 <foreach item="item" collection="list" separator=",">
 (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
 </foreach>
</insert>

从官网资料可以看出Mybatis是支持批量插入时返回自增主键的。

但是在本地测试的时候使用上述方式确实不能返回自增id,而且还报错(不认识keyProperty中指定的Id属性),然后在网上找相关资料。终于在Stackoverflow上面找到了一些信息。

解决办法:

1、升级Mybatis版本到3.3.1。官方在这个版本中加入了批量新增返回主键id的功能

2、在Dao中不能使用@param注解。

3、Mapper.xml中使用list变量(parameterType="java.util.List")接受Dao中的参数集合。

下面是具体代码过程,可供参考

mapper.xml层代码

<!-- 批量新增 -->
 <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id" >
 INSERT INTO
 <include refid="t_shop_resource" />
 (relation_id, summary_id, relation_type)
 VALUES
 <foreach collection="list" index="index" item="shopResource" separator=",">
 (
 #{shopResource.relationId}, #{shopResource.summaryId}, #{shopResource.relationType}
 )
 </foreach>
 </insert>

dao实现层代码

public List<ShopResource> batchinsertCallId(List<ShopResource> shopResourceList)
 {
 this.getSqlSession().insert(getStatement(SQL_BATCH_INSERT_CALL_ID), shopResourceList);
 return shopResourceList;// 重点介绍
 }
 

补充:MyBatis 插入的同时获取主键id

有时候进行一些多步操作的时候就需要得到最新插入一条记录的id号,那么如何在插入的同时返回id号

Mapper代码:

<insert id="insertFeeds" parameterType="com.yj.pojo.Feeds" useGeneratedKeys="true" keyProperty="id">
 insert into feeds (id, title, content,
 pic, video, auther_id,
 comments, favours, likes,
 cover_select, views, set_time,
 kind)
 values (#{id,jdbcType=INTEGER}, #{title,jdbcType=VARCHAR}, #{content,jdbcType=VARCHAR},
 #{pic,jdbcType=VARCHAR}, #{video,jdbcType=VARCHAR}, #{autherId,jdbcType=VARCHAR},
 #{comments,jdbcType=INTEGER}, #{favours,jdbcType=INTEGER}, #{likes,jdbcType=INTEGER},
 #{coverSelect,jdbcType=INTEGER}, #{views,jdbcType=INTEGER}, #{setTime,jdbcType=VARCHAR},
 #{kind,jdbcType=VARCHAR})
 </insert>

service层:

当设置了useGeneratedKeys="true" keyProperty="id"后,它会在你插入数据库的同时,将这个对象的id值改为最新的那个id,然后我们只需要取出他就可以了

最终效果:

数据库

输出

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Java高性能缓存框架之Caffeine详解

    Java高性能缓存框架之Caffeine详解

    这篇文章主要介绍了Java高性能缓存框架之Caffeine详解,Caffeine是一个基于Java8的高性能缓存框架,号称趋于完美,Caffeine受启发于Guava Cache的API,使用API和Guava是一致的,需要的朋友可以参考下
    2023-12-12
  • idea如何忽略.iml文件和.idea目录

    idea如何忽略.iml文件和.idea目录

    这篇文章主要介绍了idea如何忽略.iml文件和.idea目录问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  •  Spring 中 Bean 的生命周期详解

     Spring 中 Bean 的生命周期详解

    这篇文章主要介绍了Spring中Bean的生命周期详解,Java中的公共类称之为Bean或Java Bean,而Spring中的Bean指的是将对象的生命周期
    2022-09-09
  • 在spring boot3中使用native image的最新方法

    在spring boot3中使用native image的最新方法

    这篇文章主要介绍了在spring boot3中使用native image ,今天我们用具体的例子来给大家演示一下如何正确的将spring boot3的应用编译成为native image,需要的朋友可以参考下
    2023-01-01
  • java设计模式之外观模式(Facade)

    java设计模式之外观模式(Facade)

    这篇文章主要为大家详细介绍了java设计模式之外观模式Facade的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Java中的AES加密算法用法示例详解

    Java中的AES加密算法用法示例详解

    这篇文章主要介绍了Java中的AES加密算法用法的相关资料,AES是一种广泛使用的对称加密算法,支持128位、192位和256位密钥,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • Mybatis中的Criteria条件查询方式

    Mybatis中的Criteria条件查询方式

    这篇文章主要介绍了Mybatis中的Criteria条件查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 详解Java多线程编程中互斥锁ReentrantLock类的用法

    详解Java多线程编程中互斥锁ReentrantLock类的用法

    Java多线程并发的程序中使用互斥锁有synchronized和ReentrantLock两种方式,这里我们来详解Java多线程编程中互斥锁ReentrantLock类的用法:
    2016-07-07
  • 初次使用IDEA创建maven项目的教程

    初次使用IDEA创建maven项目的教程

    这篇文章主要介绍了初次使用IDEA创建maven项目的教程讲解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 硬核 Redis 高频面试题解析

    硬核 Redis 高频面试题解析

    Redis 是一个高性能的key-value数据库。在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端使用很方便
    2021-06-06

最新评论