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

网友投稿 498 2022-09-01


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

目录Mybatis selectKey返回新增用户的id值一、需求:新增用户后,同时还要返回当前新增用户的id值二、为什么要使用selectKey?三、属性解析Mybatis selectKey 采坑笔记一、现象描述二、问题排查三、selectKey 用法再认识四、selectKey用法的坑

Mybatis selectKey返回新增用户的id值

一、需求:新增用户后,同时还要返回当前新增用户的id值

id是由数据库的自动增长来实现的,所以就相当于我们要在新增后将自动增长auto_increment的值返回。

select last_insert_id() as id;

insert into user(username,birthday,sex,address)

values(#{username},#{birthday},#{sex},#{address})

通过LAST_INSERT_ID()获得刚插入的自动增长的id的值

或者

SELECT @@IDENTITY AS id

insert into user(username,birthday,sex,address)

values(#{username},#{birthday},#{sex},#{address})

SELECT @@IDENTITY AS id

这时也能返回新增那一条数据的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自动生成的,示例如下:

SELECT LAST_INSERT_ID()

insert into User (AutoId, UserIhttp://d, Mobile, Username, CreateTime, LastModifyTime)

values (#{autoId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{mobile,jdbcType=VARCHAR},

#{username,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{lastModifyTime,jdbcType=TIMESTAMP}

)

insert into 语句在语法上是没有问题的,那缩小排查范围,就是selectKey的用法可能有问题!

三、selectKey 用法再认识

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

四、selectKey用法的坑

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

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python调用MySQLdb库,报错 “Library not loaded: libmysqlclient.18.dylib”(import mysqldb报错)
下一篇:Django之模板继承(django模板变量)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~