借鉴:https://www.cnblogs.com/duanxz/p/3862315.html

https://yq.aliyun.com/articles/122887

在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用myBatis的selectKey标签可以实现这个效果。

SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。

不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦。

selectKey Attributes
属性 描述
keyProperty selectKey 语句结果应该被设置的目标属性。
resultType 结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。
order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。
statementType 和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,分别代表 PreparedStatement 和CallableStatement 类型。

SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。

像Oracle这样取序列的情况,需要设置为before,否则会报错。

另外在用Spring管理事务时,SelectKey和插入在同一事务当中,因而Mysql这样的情况由于数据未插入到数据库中,所以是得不到自动增长的Key。取消事务管理就不会有问题。

<insert id="insertSelective" parameterType="com.huatek.compass.frame.entity.Role">
    <selectKey keyProperty="id" resultType="String" order="BEFORE">  
               select  replace(uuid(),'-','')   from dual 
       </selectKey> 
    insert into sys_role
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="active != null">
        active,
      </if>
      <if test="comment != null">
        comment,
      </if>
      <if test="role != null">
        role,
      </if>
      <if test="groupId != null">
        group_id,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=VARCHAR},
      </if>
      <if test="active != null">
        #{active,jdbcType=INTEGER},
      </if>
      <if test="comment != null">
        #{comment,jdbcType=VARCHAR},
      </if>
      <if test="role != null">
        #{role,jdbcType=VARCHAR},
      </if>
      <if test="groupId != null">
        #{groupId,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>

selectKey 标签相关推荐

  1. MyBatis—insert语句返回主键和selectKey标签

    本文已同步至个人博客liaosi's blog - MyBatis-insert语句返回主键和selectKey标签 往数据库中插入一条记录后,有时候我们需要这条记录的主键,用于后续的操作.如果在插入 ...

  2. mybatis之selectKey标签

    保存数据后,得到自增长的主键id,用于处理其他业务逻辑 可以使用mybatis为我们提供的 selectKey标签 <selectKey resultType="java.lang.I ...

  3. Mybatis中selectKey 标签的作用,主键回填,找了好多文章没一个解释清楚。。

    (1)没有配置selectKey 标签时候插入数据: <insert id="addUser" parameterType="model.User"> ...

  4. Mybatis学习之selectKey标签用法

    Mybatis学习之selectKey标签用法 前言 实现流程 Mapper.xml文件配置 属性介绍 前言 需求说明 主从表入库时,从表需要获取主表中的最后入库自增id,可以借助Mybatis中se ...

  5. mybatis的配置文件中selectKey标签问题

    1.mybatis的配置文件中,使用sequence生成主键 未执行add方法之前,主键未生成(null):刚执行add之后,主键即生成(212) 这里的重点是,一旦执行add方法,配置文件中的sel ...

  6. selectKey标签详解

    1.为什么要使用selectKey 数据库主键包括自增和非自增,有时候新增一条数据不仅仅知道成功就行了,后边的逻辑可能还需要这个新增的主键,这时候再查询数据库就有点耗时耗力,我们可以采用selectK ...

  7. selectKey标签详解(*)

    1.为什么要使用selectKey 数据库主键包括自增和非自增,有时候新增一条数据不仅仅知道成功就行,后边的逻辑可能还需要这个新增的主键,这时候再查询数据库就有点儿耗时耗力,我们可以采用selectK ...

  8. <selectKey>标签的作用

    作用: 一些情况下,新增一条数据信息,但其主键(id)是数据库自动在数据库生成(自增),而有些业务逻辑的处理是需要要到这个生成的主键(id). 标签就是用来获取这个生成的主键(id) 例: <i ...

  9. MyBatis中的selectKey

    2019独角兽企业重金招聘Python工程师标准>>> SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式. ...

最新文章

  1. 15万奖金强化学习赛事!Go-Bigger多智能体决策智能挑战赛来了!
  2. ant design后台模板-1.前端环境搭建
  3. 【Keras】Linux一个shell脚本安装python、keras、tensorflow、anaconda等~
  4. CentOS添加一个新的硬盘、添加分区到挂载的过程
  5. 使用NAS动态存储卷创建有状态应用
  6. maven 从入门到实战
  7. Redis的持久化 RDB AOF
  8. 转载:基于Redis实现分布式锁
  9. org.gradle.api.tasks.compile.CompileOptions.setBootClasspath
  10. 语音合成芯片——SYN6658
  11. redis数据类型命令
  12. zynq使用lwip远程更新flash
  13. python argparse bool_python argparse 解析命令行参数
  14. 一个数组实现两个栈(共享栈)
  15. 《dota2》地精修补匠tinker路人攻略
  16. 分支限界法(算法分析与设计)
  17. java的课程总结报告_java课程总结报告
  18. 【分享】SDLPAL 仙剑奇侠传开源项目编译
  19. flyway数据库迁移设置实例
  20. Redis基本操作命令(图文详解)

热门文章

  1. Hadoop 入门简介
  2. buildroot概述及使用
  3. SAP 平行帐(Parallel Accounting)
  4. iOS 高德地图 地理围栏
  5. Sql语句之IFNULL() 函数
  6. monorepo工作流基础之changesets打开与进阶(Speeches)
  7. TCP三次握手四次断开及11种状态转变
  8. 3D打印与大数据会碰撞出什么样的火花?
  9. 剧本翻译之SHUFFLE 6月16日
  10. 异物卡喉应如何正确诊疗