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 相关文章推荐
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
Jun 21 Java/Android
使用Springboot实现健身房管理系统
Jul 01 Java/Android
解决Swagger2返回map复杂结构不能解析的问题
Jul 02 Java/Android
JavaWeb 入门:Hello Servlet
Jul 16 Java/Android
简述Java中throw-throws异常抛出
Aug 07 Java/Android
Java 实战项目之家居购物商城系统详解流程
Nov 11 Java/Android
JPA 通过Specification如何实现复杂查询
Nov 23 Java/Android
Android超详细讲解组件ScrollView的使用
Mar 31 Java/Android
Java十分钟精通进阶适配器模式
Apr 06 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
Apr 07 Java/Android
Android studio 简单计算器的编写
May 20 Java/Android
SpringBoot Http远程调用的方法
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
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
喜大普奔!jQuery发布 3.0 最终版
2016/06/12 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
JS实现可切换图片的幻灯切换效果示例
2019/05/24 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
[01:44]Ti10举办地公布
2019/08/25 DOTA
Python合并字符串的3种方法
2015/05/21 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
Python selenium抓取微博内容的示例代码
2018/05/17 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
简单了解python gevent 协程使用及作用
2019/07/22 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
学习Python列表的基础知识汇总
2020/03/10 Python
html5简介及新增功能介绍
2020/05/18 HTML / CSS
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
交通事故调解协议书
2014/04/16 职场文书
李培根演讲稿
2014/05/22 职场文书
横店影视城导游词
2015/02/06 职场文书
3.15消费者权益日活动总结
2015/02/09 职场文书
2016干部作风整顿心得体会
2016/01/22 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python