Mybatis selectKey 如何返回新增用户的id值

 更新时间:2022年01月23日 10:19:20   作者:_七七  
这篇文章主要介绍了Mybatis selectKey 如何返回新增用户的id值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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后,主键就开始自增了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java手写线程池的实现方法

    Java手写线程池的实现方法

    这篇文章主要为大家详细介绍了Java手写线程池的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Java中内核线程理论及实例详解

    Java中内核线程理论及实例详解

    在本篇文章里小编给大家整理了一篇关于Java中内核线程理论及实例详解内容,有兴趣的朋友们可以学习下。
    2021-03-03
  • java中VO和DTO之间的转换实现

    java中VO和DTO之间的转换实现

    本文主要介绍了java中VO和DTO之间的转换实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Java synchronized重量级锁实现过程浅析

    Java synchronized重量级锁实现过程浅析

    这篇文章主要介绍了Java synchronized重量级锁实现过程,synchronized是Java里的一个关键字,起到的一个效果是"监视器锁",它的功能就是保证操作的原子性,同时禁止指令重排序和保证内存的可见性
    2023-02-02
  • Java详解表格的创建与使用流程

    Java详解表格的创建与使用流程

    这篇文章主要介绍了怎么用Java来创建和使用表格,表格是我们经常要用的工具,但是你有想过自己怎么去实现它吗,感兴趣的朋友跟随文章往下看看吧
    2022-04-04
  • java编程无向图结构的存储及DFS操作代码详解

    java编程无向图结构的存储及DFS操作代码详解

    这篇文章主要介绍了java编程无向图结构的存储及DFS操作代码详解,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • 使用Java实现简单搭建内网穿透

    使用Java实现简单搭建内网穿透

    内网穿透是一种网络技术,适用于需要远程访问本地部署服务的场景,本文主要为大家介绍了如何使用Java实现简单搭建内网穿透,感兴趣的可以了解下
    2024-02-02
  • JavaSE图像验证码简单识别程序详解

    JavaSE图像验证码简单识别程序详解

    这篇文章主要为大家详细介绍了JavaSE图像验证码简单识别程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Java中对list map根据map某个key值进行排序的方法

    Java中对list map根据map某个key值进行排序的方法

    今天小编就为大家分享一篇Java中对list map根据map某个key值进行排序的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • springboot中使用FastJson解决long类型在js中失去精度的问题

    springboot中使用FastJson解决long类型在js中失去精度的问题

    这篇文章主要介绍了springboot中使用FastJson解决long类型在js中失去精度的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06

最新评论