详解mybatis插入数据后返回自增主键ID的问题
作者:charlyFeng 发布时间:2021-09-04 19:08:00
标签:mybatis,插入数据,主键,ID
1.场景介绍:
开发过程中我们经常性的会用到许多的中间表,用于数据之间的对应和关联.这个时候我们关联最多的就是ID,我们在一张表中插入数据后级联增加到关联表中.我们熟知的mybatis在插入数据后返回的是插入成功的条数,那么这个时候我们想要得到相应的这条新增数据的ID,该怎么办呢?
2.插入数据返回自增主键ID方法(一)
在映射器中配置获取记录主键值xml映射:
在xml中定义useGeneratedKeys为true,返回主键id的值,keyProperty和keyColumn分别代表数据库记录主键字段和java对象成员属性名
<!-- 插入数据:返回记录主键id值 -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into stu (name,age) values (#{name},#{age})
</insert>
接口映射器
在接口映射器中通过注解@Options
分别设置参数useGeneratedKeys,keyProperty,keyColumn值
// 返回主键字段id值
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into stu (name,age) values (#{name},#{age})")
void insert(Student stu);
获取新添加记录主键字段值
需要注意的是,在MyBatis中添加操作返回的是记录数并非记录主键id。因此,如果需要获取新添加记录的主键值,需要在执行添加操作之后,直接读取Java对象的主键属性。
Integer rows = sqlSession.getMapper(StuMapper.class).insertOneTest(student);
System.out.println("rows = " + rows); // 添加操作返回记录数
System.out.println("id = " + student.getId()); // 执行添加操作之后通过Java对象获取主键属性值
添加批量记录时返回主键ID
如果希望执行批量添加并返回各记录主键字段值,只能在xml映射器中实现,在接口映射器中无法做到。
<!-- 批量添加数据,并返回主键字段 -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into stu (name,age) values
<foreach collection="list" separator="," item="t">
(#{t.name},#{t.age})
</foreach>
</insert>
可以看到,执行批量添加并返回记录主键值的xml映射器配置,跟添加单条记录时是一致的。不同的地方仅仅是使用了foreach元素构建批量添加语句。
来源:https://www.cnblogs.com/charlypage/p/11253610.html
0
投稿
猜你喜欢
- FeignClient重试机制造成的接口幂等性Feign源码分析,其实现类在 SynchronousMethodHandler,实现方法是p
- 日常对于金额计算,应该都是用的BigDecimal,可是苦于没有好的工具类方法,现在贡献一个我正在用的对于数字计算的工具类,项目中就是用的这
- 一、日志工具功能封装Debug类,需要实现功能:1.控制所有日志是否打印;2.除了Log,Warning,Error外,给更多日志种类(不同
- 本文实例为大家分享了C#实现温度转换功能的具体代码,供大家参考,具体内容如下界面图代码using System;using System.C
- 简单基础的定制android系统,使第一次开机就安装系统应用和预装应用,加载服务工具和其它文件,开机启动画面,设置默认输入法、屏幕亮度等等。
- 目录1、二分查找算法思想2、二分查找图示说明3、二分查找优缺点3、java代码实现3.1 使用递归实现3.1 不使用递归实现(while循环
- 一、配置文件内容mybatis.xml就是Mybatis的全局配置文件。全局配置文件需要在头部使用约束文件。<?xml version
- 需求说明要求根据用户输入,生成相应组数的电话号码实现思路1、通过百度,获取对应真实世界中电话号码的头三位数2、采用Math.random()
- 栅栏类似闭锁,但是它们是有区别的.1.闭锁用来等待事件,而栅栏用于等待其他线程.什么意思呢?就是说闭锁用来等待的事件就是countDown事
- 本文为大家分享了javaweb实现app扫码登录的具体代码,供大家参考,具体内容如下1.web页面主动向服务器索要一张由服务器生成包含维一标
- 基于Java语言实现Socket通信由于近日项目需求,需要在服务器中增加Socket通信的功能,接收硬件设备发送的心跳包和相关数据,因此又重
- 背景SpringBoot集成Beetl后如果页面出现异常会将出现异常之前的页面输出到客户端,但是由于页面不完整会导致用户看到的页面错乱或者空
- public class MyGestureLintener extends SimpleOnGestureListener {privat
- 前言前段时间学习Chart控件,对Chart控件的,怕以后忘记,所以总结一下自己的学习成果,怕以后忘记方便自己下次复习。这篇文章只是学习的文
- 比如定义了一个错误的枚举类型public enum eErrorDetailCode : int &nbs
- springmvc 中的 * 可以对请求进行判别, 在请求到达控制器之前, 把非法的请求给拦截掉下面来说一说, 它在springboot中的
- 一、前提准备安装R软件,需要安装32位的R软件,64位的调用会报错。另外就是讲R添加到电脑环境变量中。打开R软件,安装包 scatterpl
- 背景今天学习Springboot,但是用的apache-maven 3.0 ,导入springboot1.5.19 ,Maven项目老是爆红
- 一. 方法重写在面向对象中,实现多态的必备条件是继承、重写和向上转型,现在我们已经学习了什么是继承。接下来我们再来学习什么是方法重写,这是我
- 1.需求背景需要实现一个动态加载但不显示出来的视图,且该视图上有个动态生成的二维码,最后用其去生成一张快照(也就是图片)。(常见这种情况是来