Mybatis selectKey 如何返回新增用户的id值
作者:_七七 发布时间:2022-07-14 05:10:38
Mybatis selectKey返回新增用户的id值
一、需求:新增用户后,同时还要返回当前新增用户的id值
id是由数据库的自动增长来实现的,所以就相当于我们要在新增后将自动增长auto_increment的值返回。
<insert id="saveUser" parameterType="USER">
<!-- 配置保存时获取插入的id -->
<selectKey keyColumn="id" keyProperty="id" resultType="int">
select last_insert_id() as id;
</selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
通过LAST_INSERT_ID()获得刚插入的自动增长的id的值
或者
SELECT @@IDENTITY AS id
<insert id="saveUser" parameterType="USER">
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
<selectKey resultClass="long" keyProperty="id">
SELECT @@IDENTITY AS id
</selectKey>
</insert>
这时也能返回新增那一条数据的id,这时的selectkey没有要求写在前面以@@定义的变量都是系统的全局变量。
二、为什么要使用selectKey?
数据库主键包括自增和非自增,有时候新增一条数据不仅仅知道成功就行了,后边的逻辑可能还需要这个新增的主键,这时候再查询数据库就有点耗时耗力,我们可以采用selectKey来帮助我们获取新增的主键。
三、属性解析
keyProperty
结果集映射目标类的属性;
若存在多个,则使用逗号分隔;
keyColumn
目标类的属性,映射结果集的列名;
若存在多个,则使用逗号分割;
resultType
设置返回类型;
可使用全类名或者是别名;
order
设置此selectKey的执行顺序是早于sql语句,还是晚于sql语句;
候选值是BEFORE和AFTER;
statementType
设置sql语句的映射类型;候选值有:
STATEMENT,PREPARED,CALLABLE;
databaseID
与ibatis全局配置中的databaseIdProvider标签呼应
Mybatis selectKey 采坑笔记
一、现象描述
观察某张表的数据时,发现设置了自增属性的AutoId,在插入数据后并不是自增的,而是数值跳跃着增加的。
二、问题排查
在确认AutoId的自增属性设置没有问题后,开始怀疑是不是insert语句的问题,insert语句是MyBatis Generator自动生成的,示例如下:
<insert id="insert" parameterType="com.xx.yy.datasource.domain.User" >
<selectKey resultType="java.lang.Long" keyProperty="autoId" order="BEFORE" >
SELECT LAST_INSERT_ID()
</selectKey>
insert into User (AutoId, UserId, Mobile, Username, CreateTime, LastModifyTime)
values (#{autoId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{mobile,jdbcType=VARCHAR},
#{username,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{lastModifyTime,jdbcType=TIMESTAMP}
)
</insert>
insert into 语句在语法上是没有问题的,那缩小排查范围,就是selectKey的用法可能有问题!
三、selectKey 用法再认识
resultType
:表示的是返回主键的类型keyProperty
:对应的domain 对象中需要被赋值的属性,一般是主键order
:如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素
四、selectKey用法的坑
SelectKey需要注意order属性,像MySQL一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值,像Oracle这样取序列的情况,需要设置为before。
在上面示例的insert用法中,就是order属性设置成了BEFORE才导致自增属性没有生效。改成AFTER后,主键就开始自增了。
来源:https://blog.csdn.net/qq_43472877/article/details/109776035


猜你喜欢
- 按照官方文档进行的配置:快速开始|mybatis-plus引入依赖:<!-- 引入mybatisPlus --> &
- 1.在C#中使用FolderBrowserDialog类,就可以实现选择文件夹的功能,并将所选择的的文件夹路径记录下来。(1).首先先引入命
- 背景最近公司的客户要求,分配给员工的任务除了有微信通知外,还希望PC端的网页也能实时收到通知。管理员分配任务是在我们的系统A,而员工接受任务
- 学习大佬们开发安全小工具,打包jar解决错误: 找不到或无法加载主类 main1 Maven方式遇到报错”找不到或无法加载主类 main“解
- 引言在 java8 中,您可以使用 Arrays.Stream 或 Stream.of 将 Array 转换为 Stream。1. 对象数组
- 前言在实际开发中,大多数情况下都需要对 SQL 传入参数以获得想要的结果集,传入的情况分为两种情况:1、SQL语句的拼接,比如表名、like
- protected 来谈谈protected访问权限问题。看下面示例1:Test.javaclass MyObject {}public c
- 一个Java程序的执行要经过编译和执行(解释)这两个步骤,同时Java又是面向对象的编程语言。当子类和父类存在同一个方法,子类重写了父类的方
- 前言:IO流主要分为两大类,分别是字节流与字符流注意:1、音频文件、图片、视频(范围广),就用字节流2、只涉及到文本的,就用字符流使用字节流
- 今天有朋友问我一道面试题,有5个人抢5个红包,可重复抢,用多线程程序实现,实现方式有多种,分享一下我的思路:应用了阻塞队列的特性。/**
- 本文实例为大家分享了java实现字符串反转的具体代码,供大家参考,具体内容如下1.需求:定义一个方法,实现字符串反转。键盘录入一个字符串,调
- 项目中要使用到在线支付功能 目前常用的在线支付手段主要是 支付宝 和微信。 这里我使用的是支付宝支付,支付宝有个好处就是他有一个沙箱模式 即
- 本文实例为大家分享了java实现简单发红包的具体代码,供大家参考,具体内容如下这个案例是普通红包,均分的,不是拼手气红包。package n
- Java的常量池通常分为两种:静态常量池和运行时常量池静态常量池:class文件中的常量池,class文件中的常量池包括了字符串(数字)字面
- java 多线程的几种实现方法总结1.多线程有几种实现方法?同步有几种实现方法?多线程有两种实现方法,分别是继承Thread类与实现Runn
- 本文实例为大家分享了Java手写线程池的实现代码,供大家参考,具体内容如下1.线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在
- 本文实例讲述了WPF的ListView控件自定义布局用法。分享给大家供大家参考,具体如下:概要:以源码的形式贴出,免得忘记后,再到网上查资料
- 本文实例讲述了java获取中文拼音首字母工具类定义与用法。分享给大家供大家参考,具体如下:package com.sw.documentar
- 1、线程的控制很常见,如文件传送到一半时,需要暂停文件传送,或终止文件传送,这实际上就是控制线程的运行。2、线程有创建、可运行、运行中、阻塞
- 上篇文章给大家介绍了,喜欢的朋友点击查看下。SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUILo