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的MathML转图片的方法(示例代码)
Jun 23 Java/Android
Springboot集成阿里云OSS上传文件系统教程
Jun 28 Java/Android
Springboot配置suffix指定mvc视图的后缀方法
Jul 03 Java/Android
SpringRetry重试框架的具体使用
Jul 25 Java/Android
Sleuth+logback 设置traceid 及自定义信息方式
Jul 26 Java/Android
Log4j.properties配置及其使用
Aug 02 Java/Android
浅谈sql_@SelectProvider及使用注意说明
Aug 04 Java/Android
Java移除无效括号的方法实现
Aug 07 Java/Android
Android自定义scrollview实现回弹效果
Apr 01 Java/Android
零基础学java之带返回值的方法的定义和调用
Apr 10 Java/Android
Java 数组的使用
May 11 Java/Android
httpclient调用远程接口的方法
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
多人战的战术与战略
2020/03/04 星际争霸
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
php学习笔记之面向对象
2014/11/08 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
2020/01/26 PHP
如何用javascript控制上传文件的大小
2006/10/26 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
裁剪字符串trim()自定义改进版
2013/04/10 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
Lua表达式和控制结构学习笔记
2014/12/15 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
bootstrap weebox 支持ajax的模态弹出框
2017/02/23 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
详解vue 命名视图
2019/08/14 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python 文件和路径操作函数小结
2009/11/23 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
TensorFlow实现简单的CNN的方法
2019/07/18 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
医生自荐信
2013/10/11 职场文书
学习决心书
2014/03/11 职场文书
总结表彰大会主持词
2014/03/26 职场文书
英文商务邀请函范文
2015/01/31 职场文书
行政人事主管岗位职责
2015/04/11 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
委托书范本格式
2019/04/18 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android