mybatis的selectKey作用详解

目录
  • mybatis的selectKey作用
  • mybatis selectKey 失效问题踩坑

mybatis的selectKey作用

当我们使用id自增操作Mybatis时,需要返回最新插入的id的话,可以进行如下操作:

<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID() AS ID 
</selectKey> 

在insert中添加即可:

<insert id="insert" parameterType="com.pinyougou.pojo.TbGoods" >
    <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="id">
      SELECT LAST_INSERT_ID() AS id
    </selectKey>
    insert into tb_goods (id, seller_id, goods_name,
      default_item_id, audit_status, is_marketable, 
      brand_id, caption, category1_id, 
      category2_id, category3_id, small_pic, 
      price, type_template_id, is_enable_spec, 
      is_delete)
    values (#{id,jdbcType=BIGINT}, #{sellerId,jdbcType=VARCHAR}, #{goodsName,jdbcType=VARCHAR}, 
      #{defaultItemId,jdbcType=BIGINT}, #{auditStatus,jdbcType=VARCHAR}, #{isMarketable,jdbcType=VARCHAR}, 
      #{brandId,jdbcType=BIGINT}, #{caption,jdbcType=VARCHAR}, #{category1Id,jdbcType=BIGINT}, 
      #{category2Id,jdbcType=BIGINT}, #{category3Id,jdbcType=BIGINT}, #{smallPic,jdbcType=VARCHAR}, 
      #{price,jdbcType=DECIMAL}, #{typeTemplateId,jdbcType=BIGINT}, #{isEnableSpec,jdbcType=VARCHAR}, 
      #{isDelete,jdbcType=VARCHAR})
  </insert>

然后操作int newId = goodsMapper.insert(goods.getGoods()); 就能拿到最新加入的ID信息了

mybatis selectKey 失效问题踩坑

  • selectKey 会将 SELECT LAST_INSERT_ID()的结果放入到传入的实体类的主键里面,
  • keyProperty对应的实体类中的主键的属性名,这里是 实体类中的id,因为它跟数据库的主键对应order
  • AFTER 表示 SELECT LAST_INSERT_ID() 在insert执行之后执行,多用与自增主键,
  • BEFORE 表示 SELECTLAST_INSERT_ID() 在insert执行之前执行,这样的话就拿不到主键了,这种适合那种主键不是自增的类型

resultType 主键类型

<insert id="insertCheckGroup"  parameterType="com.zyl.pojo.CheckGroup">
        <selectKey resultType="int" keyProperty="id" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into check_group (name) value (#{name});
</insert>

当使用了selectkey时 Dao接口请勿使用@Param 映射注解,会导致selectKey标签失效

int insertCheckGroup(CheckGroup checkGroup);

如果传多个参数需使用@Param时

int insertCheckGroup(@Param("test") CheckGroup checkGroup);

xml标签keyProperty对应主键名称时应加上test.

<insert id="insertCheckGroup"  parameterType="com.zyl.pojo.CheckGroup">
        <selectKey resultType="int" keyProperty="test.id" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into check_group (name) value (#{name});
</insert>

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

(0)

相关推荐

  • MyBatis如何使用selectKey返回主键的值

    目录 使用selectKey返回主键的值 对于MySQL数据库 通过selectkey返回insert或update后的值 @selectKey使用 方案1 方案2 使用selectKey返回主键的值 使用<selectKey>标签来获取插入操作主键返回的值. 对于MySQL数据库   <insert id="insert">        insert into user(        username, password, email, info, hea

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

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

  • Mybatis示例之SelectKey的应用

    SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式. 不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦. SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值. 像Oracle这样取序列的情况,需要设置为before,否则会报错. 下面是一个xml和注解的例子,SelectKey很简单,两个例子就够了: <insert id=&quo

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

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

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

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

  • Mybatis @SelectKey用法解读

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

  • mybatis的selectKey作用详解

    目录 mybatis的selectKey作用 mybatis selectKey 失效问题踩坑 mybatis的selectKey作用 当我们使用id自增操作Mybatis时,需要返回最新插入的id的话,可以进行如下操作: <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id"> SELECT LAST_INSERT_ID() AS ID  &l

  • Mybatis映射文件实例详解

     一.输入映射 parameterType 指定输入参数的Java类型,可以使用别名或者类的全限定名.它可以接收简单类型.POJO.HashMap. 1.传递简单类型 根据用户ID查询用户信息: <select id="findUserById" parameterType="int" resultType="com.itheima.mybatis.po.User"> SELECT * FROM USER WHERE id =#{id

  • mybatis的动态sql详解(精)

    MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种情形,这种语言可以被用在任意映射的SQL语句中. 动态SQL元素和使用 JSTL或其他相似的基于XML的文本处理器相似.在MyBatis之前的版本中,有很多

  • MyBatis查询缓存实例详解

    查询缓存的使用,主要是为了提高查询访问速度.将用户对同一数据的重复查询过程简化,不再每次均从数据库查询获取结果数据,从而提高访问速度. MyBatis的查询缓存机制,根据缓存区的作用域(生命周期)可划分为两种:一级缓存与二级缓存 一.一级查询缓存 MyBatis一级缓存是基于org.apache.ibatis.cache.impl.PerpetualCache类的HashMap本地缓存,其作用域是Sqlsession.在同一个Sqlsession中两次执行相同的sql语句,第一次执行完毕后,会将

  • IDEA版最新MyBatis程序配置教程详解

    实验环境:IDEA2020.1+MySQL8.0.21+Mybatis3.5.5+Junit4.13 搭建环境–>导入Mybatis->编写代码->测试 1.搭建实验数据库 我们创建一个mybatis实验数据库,并创建一个user表为后续实验准备 CREATE DATABASE `mybatis`; USE `mybatis`; CREATE TABLE `user`( `id` INT(4) NOT NULL PRIMARY key, `name` VARCHAR(20) NOT NU

  • MyBatis 动态SQL全面详解

    目录 前言 动态sql 1.先看一下模块目录结构 2.物理建模和逻辑建模 3. 引入依赖 4.全局配置文件 5.sql共性抽取文件 6.mapper接口 if 静态sql: 动态sql: where 用if标签的动态sql: where和if的动态sql: trim trim的动态sql trim标签: set trim的动态sql: set的动态sql set标签的作用: choose.when.otherwise 动态sql foreach 1.动态sql 2.动态sql 批量查询:fore

  • MyBatis集成Spring流程详解

    目录 一.Mybatis与spring集成 1. 导入pom依赖 2. 编写配置文件 3. 使用注解开发 4. 测试 5. 管理数据源 二.Aop整合pagehelper插件 要解决的问题 一.Mybatis与spring集成 1. 导入pom依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8

  • MyBatis的foreach语句详解

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有 item,index,collection,open,separator,close.item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collectio

  • Mysql中explain作用详解

    一.MYSQL的索引 索引(Index):帮助Mysql高效获取数据的一种数据结构.用于提高查找效率,可以比作字典.可以简单理解为排好序的快速查找的数据结构. 索引的作用:便于查询和排序(所以添加索引会影响where 语句与 order by 排序语句). 在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据.这样就可以在这些数据结构上实现高级查找算法.这些数据结构就是索引. 索引本身也很大,不可能全部存储在内存中,所以索引往往以索引文件的形式存储在磁盘上. 我们

  • mybatis分页插件pageHelper详解及简单实例

    mybatis分页插件pageHelper详解及简单实例 工作的框架spring springmvc mybatis3 首先使用分页插件必须先引入maven依赖,在pom.xml中添加如下 <!-- 分页助手 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>3.7.5

随机推荐