文档章节

Mybatis执行批量插入返回数据库主键列表

小致dad
 小致dad
发布于 2017/07/23 16:13
字数 542
阅读 101
收藏 1

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

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

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

<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值, 所以接收返回时,返回方法形参参数即可,同样的地址引用改变了内容,返回后的集合也是改变后的集合。

© 著作权归作者所有

共有 人打赏支持
小致dad
粉丝 138
博文 535
码字总数 580132
作品 0
济南
技术主管
Mybatis3.3.x技术内幕(十四):Mybatis之KeyGenerator

在Mybatis中,执行insert操作时,如果我们希望返回数据库生成的自增主键值,那么就需要使用到KeyGenerator对象。 需要注意的是,KeyGenerator的作用,是返回数据库生成的自增主键值,而不是生...

祖大俊
2016/05/11
890
3
Mybatis3.3.x技术内幕(十五):Mybatis之foreach批量insert,返回主键id列表(修复Mybatis返回null的bug)

Mybatis在执行批量插入时,如果使用的是for循环逐一插入,那么可以正确返回主键id。如果使用动态sql的foreach循环,那么返回的主键id列表,可能为null,这让很多人感到困惑;本文将分析问题产...

祖大俊
2016/05/13
9.6K
17
Mybatis-select、insert、update、delete标签详解

<selectid="selectPerson"parameterType="int"parameterMap="deprecated"resultType="hashmap"resultMap="personResultMap"flushCache="false"useCache="true"timeout="10000"fetchSize="256......

Romanceling
2016/10/11
2.1K
0
mybatis+mysql返回自增长主键的二种方式

一、第一种方式 INSERT INTO users (username,password,nickname,token,regtime,logintime) VALUES (#{username},#{password},#{nickname},#{token},#{regTime},#{loginTime}) u......

xtceetg
2017/08/19
0
0
Mybatis 自动生成主键

介绍 像MySql、Sql Server有自动生成主键(递增),Oracle只能用序列生成,或者UUID那么在MyBatis怎么处理呢,有两个处理方式,那么我们接下来看看怎么处理 编码 useGeneratedKeys 如前所述,...

小彬彬_
2016/08/26
119
0

没有更多内容

加载失败,请刷新页面

加载更多

CMD命令行:查看Windows操作系统的安装时间

电脑越用越卡,计划以后每两个月重新安装一次系统。 那,怎么查看自己系统的安装日期? 问题抛出来了,其实很简单的。 cmd 中输入 systeminfo 命令,回车,等一会 …… 出来结果后,查找下面...

LivingInFHL
4分钟前
0
0
复习

10月19日任务 打印某行到某行之间的内容 sed转换大小写 sed在某一行最后添加一个数字 删除某行到最后一行 打印1到100行含某个字符串的行 一.打印某行到某行之间的内容 #sed -n '/\[abcfd\]/...

hhpuppy
5分钟前
0
0
精通Spring Boot——第十一篇:使用自定义配置

今天这篇文章给大家介绍自定义配置的两种方式 第一式: 使用@ConfigurationProperties,且看代码 package com.developlee.customconfig.config;import org.springframework.boot.context.p...

developlee的潇洒人生
11分钟前
0
0
python:pycharm启动出现异常:io.netty.channel.ChannelException.....

尝试用管理员权限启动终端, 输入: netsh winsock reset 重启电脑. 360的优化搞出来的幺蛾子........

Oh_really
20分钟前
0
0
设计模式学习与应用——策略模式

概念 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。 使用场景 1.在系统里面许多类,类之间区别仅在于方法行为,那么...

隔壁老余在这
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部