mybatis 批量插入后未正常获取批量的主键id问题分析


内容一:


1.dao中不要出现@param注解,集合变量名请使用list
2.collection对应的值请使用list
解释:
当我们传递一个 List 实例或者数组作为参数对象传给 MyBatis。MyBatis 会自动将它包装在一个 Map 中,名称为key。List 实例将会以“list” 作为key 而数组实例将会以“array”作为value。所以,当我们传递的是一个List集合时,mybatis会自动把我们的list集合包装成以list为Key值的map。如1要求不使用指定key的话,我们需要指定默认值 collection=“list”
3.数据库版本要求3.3以上版本


内容二:


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

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

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

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

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>

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>

从官网资料可以看出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后的insert的返回值呢,细心的话可以发现,如果使用debug模式观察,会看到调用mybatis后insert的返回值是[],也就是空集合元素,在mybatis3.3.1中,虽然加入了批量新增返回主键id的功能,但是它是这样运行的,在需要新增插入新元素集合对象时,它会需要参数对象,当执行完插入操作后,给之前的参数对象设置id值,也就是改变了需要插入对象集合中的元素的属性id值, 所以接收返回时,返回方法形参参数即可,同样的地址引用改变了内容,返回后的集合也是改变后的集合。

查考文献:

一、mybatis 批量插入后获取 批量的主键id
二、mybatis 批量插入 返回主键id

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值