Mybatis @SelectKey用法解读

作者:SihgYu 时间:2022-04-18 18:01:35 

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

来源:https://blog.csdn.net/qq_37866486/article/details/91800873

标签:Mybatis,@SelectKey
0
投稿

猜你喜欢

  • Java实现Word/Pdf/TXT转html的示例

    2023-09-03 19:57:42
  • 使用纯Java实现一个WebSSH项目的示例代码

    2023-03-11 11:32:20
  • 详述 DB2 分页查询及 Java 实现的示例

    2023-04-21 12:39:12
  • springboot整合mybatis-plus基于注解实现一对一(一对多)查询功能

    2021-06-16 13:08:29
  • Java接口的简单定义与实现方法示例

    2022-11-22 05:04:43
  • Java中ReentrantLock4种常见的坑

    2021-09-26 10:51:46
  • IntelliJ IDEA使用git初始化仓库的使用方法

    2022-05-24 12:37:26
  • java实现轻量型http代理服务器示例

    2021-10-05 18:14:20
  • 解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

    2023-11-28 20:53:42
  • Java与Node.js利用AES加密解密出相同结果的方法示例

    2021-09-11 21:06:58
  • 关于Mybatis与JPA的优缺点说明

    2023-08-23 22:28:33
  • java实现冒泡排序算法

    2023-10-17 20:44:01
  • Spring bean为什么需要依赖注入

    2022-01-24 11:07:21
  • springboot搭建访客管理系统的实现示例

    2023-09-02 13:10:41
  • Java常用数字工具类 数字转汉字(1)

    2022-06-25 11:01:45
  • Spring注解@Scope原理及用法解析

    2023-12-06 14:08:17
  • 浅谈Java中Map和Set之间的关系(及Map.Entry)

    2023-08-25 02:23:48
  • 浅谈Java之Map 按值排序 (Map sort by value)

    2021-06-20 01:23:10
  • Spring boot 连接多数据源过程详解

    2023-11-28 12:09:51
  • android使用PullToRefresh实现下拉刷新和上拉加载

    2023-08-06 11:06:58
  • asp之家 软件编程 m.aspxhome.com