我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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,然后我们只需要取出他就可以了

最终效果:

数据库

输出

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Mybatis如何批量插入并返回主键id

这篇文章主要介绍“Mybatis如何批量插入并返回主键id”,在日常操作中,相信很多人在Mybatis如何批量插入并返回主键id问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mybatis如何批量插入并返回主
2023-06-29

Mybatis 在 insert 插入操作后返回主键 id的操作方法

这篇文章主要介绍了Mybatis 在 insert 插入操作后返回主键 id的操作方法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-12-15

mybatis怎么实现批量插入并返回主键

本篇内容主要讲解“mybatis怎么实现批量插入并返回主键”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis怎么实现批量插入并返回主键”吧!mybatis批量插入并返回主键(xml和注
2023-06-21

MyBatis在insert插入操作时返回主键ID的配置(推荐)

很多时候,在向数据库插入数据时,需要保留插入数据的id,以便进行后续的update操作或者将id存入其他表作为外键。但是,在默认情况下,insert操作返回的是一个int值,并且不是表示主键id,而是表示当前SQL语句影响的行数。。。接下来
2023-05-30

Mybatis执行插入语句后并返回主键ID问题

这篇文章主要介绍了Mybatis执行插入语句后并返回主键ID问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-07

利用Mybatis如何实现返回插入的主键id

利用Mybatis如何实现返回插入的主键id?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在mapper的xml文件中配置 useGeneratedKeys以及 keyPro
2023-05-31

Mybatis如何插入一条或批量插入返回带有自增长主键记录

这篇文章主要介绍了Mybatis如何插入一条或批量插入返回带有自增长主键记录,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先讲一下, 插入一条记录返回主键的 Mybatis
2023-05-30

Mybatis-plus插入后返回元素id的问题

这篇文章主要介绍了Mybatis-plus插入后返回元素id的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-21

Mybatis执行插入语句后并返回主键ID问题怎么解决

这篇文章主要讲解了“Mybatis执行插入语句后并返回主键ID问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mybatis执行插入语句后并返回主键ID问题怎么解决”吧!1、MyS
2023-07-05

Python3 操作 MySQL 插入一条数据并返回主键 id的实例

Python 中貌似并没有直接返回插入数据 id 的操作(反正我是没找到),但是我们可以变通一下,找到最新插入的数据#!/usr/bin/env python3 # -*- coding: UTF-8 -*- import pymysql
2022-05-27

在MyBatis中使用MySQL如何实现返回插入的主键ID

这篇文章给大家介绍在MyBatis中使用MySQL如何实现返回插入的主键ID,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值。方法:
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录