mybatis 获取更新记录的id


Posted in Java/Android onMay 20, 2022

获取更新(update)记录的id之<selectKey>

问题

用mybatis update 记录,更新过后想要更新记录的id 怎么办?

平常我门都是更新数据,用更新的条件再查询一次,得到更新的记录。这样我门就进行了两次数据库操作,链接了两次数据库。增加了接口的处理事件,因为链接数据库是很耗时的操作。

简介

其实可以通过 mybatis 的 selectKey 标签来解决这个问题。

selectKey 这个标签大家基本上都用过,比如在插入数据的时候,返回插入数据的纪录。如:

 <selectKey resultType="int" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID()
 </selectKey>
insert into  。。。。此处省略
  • resultType :返回的类型,为简单类型。
  • order: 在insert into 语句执行后执行。
  • keyProperty : 语句执行结果的 返回目标属性

SELECT LAST_INSERT_ID() 为查询主体。

此处用法用法就是当 insert into 执行后 执行 selectKey 的内容将数据库的最后一个id 查询出来映射到传入数据对像的ID 属性。

解决 获取update 纪录的id

假设我门有个 bean 为people

public class People {
private Integer id 
private String name;
private String email;
...
}

现在我门写一个更新语句,并将更新的纪录的ID 返回出来。mybatis 语句如下:

通过 People 的name 去更新 People 的email,并获取被更新纪录的id。

    <update id="updateByUserName" parameterType="com.test.bean.People">
 <selectKey keyProperty='id' resultType='int' order='BEFORE'>
            SELECT
            (select id FROM people WHERE
             name = #{name})id
            from DUAL
  </selectKey>
        UPDATE people SET
      email=#{email}
        WHERE
       name =#{name}
  </update>

上述代码就是通过 selectKey 实现了 通过 People 的name 去更新 People 的email,并获取被更新纪录的id。

详解

 <selectKey keyProperty='id' resultType='int' order='BEFORE'>

此处的 keyProperty=’id’ 是指将查询出来的id 映射到传入updateByUserName 的people 的id 。类型为int

因为可能查到name 以后可能会修改name 所以order=’BEFORE’ 要在执行update之前进行查询,并把id返回出来。

SELECT
    (select id FROM people WHERE
    name = #{name})id
from DUAL 

此 SELECT 就是为了获取 被更新的 people 的id 外边包装一个虚表查询是当 name = #{name} 查询不到纪录时不会报空纪录,会返回 null ,这个就很关键了。

当返回空记录的时候 mybatis会报错,说不能转换成 int 型。

当返回null的时候就会转换成int 的 0 。不会报错,代表没有查到。(是不是很机智?)

下边的的更新语句就不说了…

   UPDATE people SET
      email=#{email}
        WHERE
       name =#{name}

<selectKey>标签的含义

MyBatis 标签

这个标签主要用于Insert数据时不支持主键自动生成的问题

selectKey keyProperty=”m_Id” order=”AFTER” resultType=”int”>
select LAST_INSERT_ID()
selectKey>

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

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


Tags in this post...

Java/Android 相关文章推荐
详解SpringBoot异常处理流程及原理
Jun 21 Java/Android
详解Java实现数据结构之并查集
Jun 23 Java/Android
Java基础之详解HashSet的使用方法
Jun 30 Java/Android
SpringBoot读取Resource下文件的4种方法
Jul 02 Java/Android
Spring实现内置监听器
Jul 09 Java/Android
Java使用JMeter进行高并发测试
Nov 23 Java/Android
Java并发编程之原子性-Atomic的使用
Mar 16 Java/Android
Java8利用Stream对列表进行去除重复的方法详解
Apr 14 Java/Android
Java工作中实用的代码优化技巧分享
Apr 21 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 Java/Android
Spring Data JPA框架自定义Repository接口
Apr 28 Java/Android
一文搞懂Java中的注解和反射
Jun 21 Java/Android
Android Studio 计算器开发
May 20 #Java/Android
Android Studio实现简易进制转换计算器
May 20 #Java/Android
Spring 使用注解开发
May 20 #Java/Android
MyBatis核心源码深度剖析SQL语句执行过程
Java 轮询锁使用时遇到问题
May 11 #Java/Android
Java 死锁解决方案
May 11 #Java/Android
JAVA springCloud项目搭建流程
May 11 #Java/Android
You might like
判断是否为指定长度内字符串的php函数
2010/02/16 PHP
PHP中=赋值操作符对不同数据类型的不同行为
2011/01/02 PHP
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
解析dedecms空间迁移步骤详解
2013/05/15 PHP
Javascript !!的作用
2008/12/04 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
Javascript学习笔记之数组的遍历和 length 属性
2014/11/23 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
微信小程序 解决swiper不显示图片的方法
2017/01/04 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
详解Python中heapq模块的用法
2016/06/28 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
利用python实现在微信群刷屏的方法
2019/02/21 Python
Django中使用极验Geetest滑动验证码过程解析
2019/07/31 Python
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
英国电子专家:maplin
2019/09/04 全球购物
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
入股协议书
2014/04/14 职场文书
2014优秀党员事迹材料
2014/08/14 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
加班费申请报告
2015/05/15 职场文书
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android