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并发编程之详解CyclicBarrier线程同步
Jun 23 Java/Android
IDEA使用SpringAssistant插件创建SpringCloud项目
Jun 23 Java/Android
Spring mvc是如何实现与数据库的前后端的连接操作的?
Jun 30 Java/Android
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
Aug 30 Java/Android
Spring-cloud Config Server的3种配置方式
Sep 25 Java/Android
Mybatis是这样防止sql注入的
Dec 06 Java/Android
JVM的类加载器和双亲委派模式你了解吗
Mar 13 Java/Android
spring注解 @PropertySource配置数据源全流程
Mar 25 Java/Android
mapstruct的用法之qualifiedByName示例详解
Apr 06 Java/Android
Java 深入探究讲解简单工厂模式
Apr 07 Java/Android
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
Jun 21 Java/Android
Java+swing实现抖音上的表白程序详解
Jun 25 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实现word转html的方法
2016/01/22 PHP
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
js使用心得分享
2015/01/13 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
2015/08/26 Javascript
JavaScript表单验证实例之验证表单项是否为空
2016/01/10 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
2016/05/27 Javascript
简单的js表格操作
2016/09/24 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
2018/02/08 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
10款最好的Web开发的 Python 框架
2015/03/18 Python
python文件写入实例分析
2015/04/08 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
python lxml中etree的简单应用
2019/05/10 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
Python实现手绘图效果实例分享
2020/07/22 Python
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
2014年机关后勤工作总结
2014/12/16 职场文书
公司员工手册范本
2015/05/14 职场文书
李强为自己工作观后感
2015/06/11 职场文书