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 相关文章推荐
Java内存模型之happens-before概念详解
Jun 13 Java/Android
Java基础之详解HashSet的使用方法
Jun 30 Java/Android
Android Rxjava3 使用场景详解
Apr 07 Java/Android
Java Lambda表达式常用的函数式接口
Apr 07 Java/Android
Android开发实现极为简单的QQ登录页面
Apr 24 Java/Android
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
Apr 24 Java/Android
java版 联机五子棋游戏
May 04 Java/Android
Mybatis-plus配置分页插件返回统一结果集
Jun 21 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
Jun 25 Java/Android
Spring boot admin 服务监控利器详解
Aug 05 Java/Android
HttpClient实现文件上传功能
Aug 14 Java/Android
spring boot实现文件上传
Aug 14 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 已经成熟
2006/12/04 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
php中define用法实例
2015/07/30 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
全面了解Python环境配置及项目建立
2016/06/30 Python
python django事务transaction源码分析详解
2017/03/17 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
2020/04/23 Python
Python 实现微信防撤回功能
2019/04/29 Python
详解python中的线程与线程池
2019/05/10 Python
pandas如何处理缺失值
2019/07/31 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
职工趣味运动会方案
2014/02/10 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书