Mybatis @SelectKey用法解读

 更新时间:2021年09月24日 09:21:37   作者:SihgYu  
这篇文章主要介绍了Mybatis @SelectKey用法解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mybatis @SelectKey用法

用处

主要用来解决主键自增问题

用法

@SelectKey(statement="SELECT LAST_INSERT_ID()", keyProperty="clusterId", before=false, resultType=Integer.class)

属性

  • keyProperty 语句结果被设置的属性
  • resultType 结果的类型
  • order 可以被设置为before和after 如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。
  • statement 和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,分别代表 PreparedStatement 和CallableStatement 类型。

注意

SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。像Oracle这样取序列的情况,需要设置为before,否则会报错。像Oracle这样取序列的情况,需要设置为before,否则会报错。

Mybatis selectKey 采坑笔记

1.现象描述

观察某张表的数据时,发现设置了自增属性的AutoId,在插入数据后并不是自增的,而是数值跳跃着增加的。

2.问题排查

在确认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的用法可能有问题!

3. selectKey 用法再认识

  • resultType表示的是返回主键的类型
  • keyProperty对应的domain 对象中需要被赋值的属性,一般是主键
  • order如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素

4.selectKey用法的坑

SelectKey需要注意order属性,像MySQL一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值,像Oracle这样取序列的情况,需要设置为before。

在上面示例的insert用法中,就是order属性设置成了BEFORE才导致自增属性没有生效。改成AFTER后,主键就开始自增了。

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

相关文章

  • 如何更好的使用Java8中方法引用详解

    如何更好的使用Java8中方法引用详解

    在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法,这种特性就叫做方法引用(Method Reference)。下面这篇文章主要给大家介绍了关于如何更好的使用Java8中方法引用的相关资料,需要的朋友可以参考下。
    2017-09-09
  • 一文带你入门JDK8新特性——Lambda表达式

    一文带你入门JDK8新特性——Lambda表达式

    这篇文章主要介绍了JDK8新特性——Lambda表达式的相关资料,帮助大家更好的理解和学习JAVA开发,感兴趣的朋友可以了解下
    2020-08-08
  • spring整合redis以及使用RedisTemplate的方法

    spring整合redis以及使用RedisTemplate的方法

    本篇文章主要介绍了spring整合redis以及使用RedisTemplate的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • IntelliJ IDEA 2022.2最新版本激活教程(亲测可用版)永久激活工具分享

    IntelliJ IDEA 2022.2最新版本激活教程(亲测可用版)永久激活工具分享

    Jetbrains官方发布了 IntelliJ IDEA2022.2 正式版,每次大的版本更新,都会有较大的调整和优化,除本次更新全面拥抱 Java 17 外,还有对IDE UI界面,安全性,便捷性等都做了调整和优化完善,用户体验提升不少,相信后面会有不少小伙伴跟着更新
    2022-08-08
  • Java中transient关键字的详细总结

    Java中transient关键字的详细总结

    本文要介绍的是Java中的transient关键字,transient是短暂的意思。对于transient 修饰的成员变量,在类的实例对象的序列化处理过程中会被忽略,感兴趣的朋友可以参考阅读
    2023-04-04
  • IDEA中Mybatis的MGB使用逆向工程配置的详细教程

    IDEA中Mybatis的MGB使用逆向工程配置的详细教程

    这篇文章主要介绍了IDEA中Mybatis的MGB使用逆向工程配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • JAVA 运算符归纳总结

    JAVA 运算符归纳总结

    这篇文章主要对Java语法基础之运算符进行了详细的归纳总结,需要的朋友可以参考
    2017-04-04
  • SpringBoot创建自定义Starter代码实例

    SpringBoot创建自定义Starter代码实例

    这篇文章主要介绍了SpringBoot创建自定义Starter代码实例,自定义 Starter 是一种在软件开发中常用的技术,它可以帮助开发者快速搭建项目的基础框架和配置,可以将一些常用的功能、依赖和配置封装成一个可复用的模块,方便在不同的项目中使用,需要的朋友可以参考下
    2023-11-11
  • Spring数据访问模板化方法

    Spring数据访问模板化方法

    今天小编就为大家分享一篇关于Spring数据访问模板化,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • MyBatis框架中mybatis配置文件详细介绍

    MyBatis框架中mybatis配置文件详细介绍

    这篇文章主要介绍了MyBatis框架中mybatis配置文件详细介绍,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01

最新评论