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

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

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

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

(0)

相关推荐

  • 详解mysql插入数据后返回自增ID的七种方法

    引言 mysql 和 oracle 插入的时候有一个很大的区别是: oracle 支持序列做 id: mysql 本身有一个列可以做自增长字段. mysql 在插入一条数据后,如何能获得到这个自增 id 的值呢? 一:使用 last_insert_id() SELECT LAST_INSERT_ID(); 1. 每次 mysql 的 query 操作在 mysql 服务器上可以理解为一次"原子"操作, 写操作常常需要锁表, 这里的锁表是 mysql 应用服务器锁表不是我们的应用程序锁表

  • mybatis的insert语句插入数据时的返回值的实现

    mybatis的sql语句一般是配置在配置文件中,现先给出一个例子, sqlMap.xml文件中的一条插入语句: <insert id="add" parameterClass="xxx"> insert into A(a, b, c, d) VALUE (#a#, #b#, #c#, #d#) </insert> 以上的代码片段只是最简单的插入语句,上面这条SQL语句无论执行结果是成功还是失败,它的返回值都是null 如果想要在执行插入之后

  • MyBatis insert语句返回主键和selectKey标签方式

    目录 insert语句返回主键和selectKey标签 1.主键自增的情况 2.Oracle中用Sequence获取主键 MyBatis insert语句key的生成和返回 1.使用数据库自带的生成器 2.使用selectKey insert语句返回主键和selectKey标签 往数据库中插入一条记录后,有时候我们需要这条记录的主键,用于后续的操作. 如果在插入后再去查一次数据库,显然不够优雅和效率,MyBatis中已经有了insert后返回主键的功能,下面就主要讲几种不同情况的具体做法. 1.

  • Mybatis插入时返回自增主键方式(selectKey和useGeneratedKeys)

    目录 Mybatis插入时返回自增主键 Mybatis批量插入返回自增主键 解决办法 Mybatis插入时返回自增主键 通过selectKey在插入操作前或者操作后获取key值,做为字段插入或返回字段.(此段代码获取的序列值id作为字段值插入到实体类中返回) <insert id="insert"> <selectKey keyProperty="id" resultType="int" order="AFTER&qu

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

    目录 Mybatis selectKey返回新增用户的id值 一.需求:新增用户后,同时还要返回当前新增用户的id值 二.为什么要使用selectKey? 三.属性解析 Mybatis selectKey 采坑笔记 一.现象描述 二.问题排查 三.selectKey 用法再认识 四.selectKey用法的坑 Mybatis selectKey返回新增用户的id值 一.需求:新增用户后,同时还要返回当前新增用户的id值 id是由数据库的自动增长来实现的,所以就相当于我们要在新增后将自动增长aut

  • mybatis插入数据后如何返回新增数据的id值

    目录 1.自增主键情况下插入数据获取自增主键值 2.主键非自增的情况下获取主键值 3.keyColumn作用 总结 1.自增主键情况下插入数据获取自增主键值 mybatis为我们提供了一个方法,能够插入数据时获取自动生成的值,并且把取的值赋值给实体类的某一属性 设置方法: 要求:主键必须是自增的 <insert id = "insert" useGeneratedKeys = "true" keyProperty = "id">  

  • Mybatis批量插入返回插入成功后的主键id操作

    我们都知道Mybatis在插入单条数据的时候有两种方式返回自增主键: 1.对于支持生成自增主键的数据库:增加 useGenerateKeys和keyProperty ,<insert>标签属性. 2.不支持生成自增主键的数据库:使用<selectKey>. 但是怎么对批量插入数据返回自增主键的解决方式网上看到的还是比较少,至少百度的结果比较少. Mybatis官网资料提供如下: First, if your database supports auto-generated key

  • MyBatis insert操作插入数据之后返回插入记录的id

    MyBatis插入数据的时候,返回该记录的id <insert id="insert" keyProperty="id" useGeneratedKeys="true"
 parameterType="com.demo.domain.CountRateConfig">
 insert into query_rate_config (code,partner_type,search_count, booking_co

  • MyBatis获取插入记录的自增长字段值(ID)

    第一步: 在Mybatis Mapper文件中添加属性"useGeneratedKeys"和"keyProperty",其中keyProperty是Java对象的属性名! <insert id="insert" parameterType="Spares" useGeneratedKeys="true" keyProperty="id"> insert into spares

  • Mybatis入门教程之新增、更新、删除功能

    上一节说了Mybatis的框架搭建和简单查询,这次我们来说一说用Mybatis进行基本的增删改操作: 一. 插入一条数据 1.首先编写USER.XML(表的xml)使用insert元素,元素写在mapper中: <insert id="insertitem" parameterType="cn.qkp.po.user"> INSERT INTO user(username,birthday,sex,address) VALUES(#{username},

  • MyBatis插入数据返回主键的介绍

    Service层: public int addUser(UserDomian user){ int i = userMapper.insert(user); } xml: <insert id="insert" parameterType="....UserDomain"> insert into t_user(user_name,password) values (#{userName},#{password}) </insert> 这样

  • Mybatis @SelectKey用法解读

    目录 Mybatis @SelectKey用法 用处 用法 属性 注意 Mybatis selectKey 采坑笔记 1.现象描述 2.问题排查 3. selectKey 用法再认识 4.selectKey用法的坑 Mybatis @SelectKey用法 用处 主要用来解决主键自增问题 用法 @SelectKey(statement="SELECT LAST_INSERT_ID()", keyProperty="clusterId", before=false,

  • Linux命令每天必学之 useradd/adduser 新增用户

    Linux下useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户. 语法: useradd [参数] name 参数: -c:加上备注文字,备注文字保存在passwd的备注栏中. -d:–home-dir HOME_DIR 指定home目录 -e:指定账号的失效日期,日期格式为MM/DD/YY,例如06/30/12.缺省表示永久有效. -f:指定在密码过期后多少天即关闭该账号.如果为0账号立即被停用:如果为-1则账号一直可用.默认值为-1. -g:–gid

随机推荐