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循环队列与非循环队列的区别总结
Jun 22 Java/Android
springboot如何初始化执行sql语句
Jun 22 Java/Android
Java中PriorityQueue实现最小堆和最大堆的用法
Jun 27 Java/Android
Java中常用解析工具jackson及fastjson的使用
Jun 28 Java/Android
spring cloud 配置中心客户端启动遇到的问题
Sep 25 Java/Android
解析探秘fescar分布式事务实现原理
Feb 28 Java/Android
SpringBoot2零基础到精通之数据库专项精讲
Mar 22 Java/Android
Spring Boot 底层原理基础深度解析
Apr 03 Java/Android
Java实现扫雷游戏详细代码讲解
May 25 Java/Android
Spring JPA 增加字段执行异常问题及解决
Jun 10 Java/Android
springboot集成redis存对象乱码的问题及解决
Jun 16 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
Ajax PHP简单入门教程代码
2008/04/25 PHP
PHP面向对象精要总结
2014/11/07 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
js change,propertychange,input事件小议
2011/12/20 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
JS获取html元素的标记名实现方法
2016/10/08 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
Python模块学习 filecmp 文件比较
2012/08/27 Python
Python库urllib与urllib2主要区别分析
2014/07/13 Python
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
Python类的专用方法实例分析
2015/01/09 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
Python如何通过Flask-Mail发送电子邮件
2020/01/29 Python
pandas参数设置的实用小技巧
2020/08/23 Python
python statsmodel的使用
2020/12/21 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
阿巴庭院:Abba Patio
2019/06/18 全球购物
大学生村官典型材料
2014/01/12 职场文书
安全承诺书
2015/01/19 职场文书
会议通知格式范文
2015/04/15 职场文书
古诗之感恩老师
2019/10/24 职场文书