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 相关文章推荐
elasticSearch-api的具体操作步骤讲解
Jun 28 Java/Android
Java使用httpRequest+Jsoup爬取红蓝球号码
Jul 02 Java/Android
解决Swagger2返回map复杂结构不能解析的问题
Jul 02 Java/Android
java设计模式--建造者模式详解
Jul 21 Java/Android
logback如何自定义日志存储
Aug 30 Java/Android
java协程框架quasar和kotlin中的协程对比分析
Feb 24 Java/Android
SpringBoot整合minio快速入门教程(代码示例)
Apr 03 Java/Android
详解Flutter网络请求Dio库的使用及封装
Apr 14 Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
Apr 19 Java/Android
Spring Data JPA框架Repository自定义实现
Apr 28 Java/Android
Java存储没有重复元素的数组
Apr 29 Java/Android
使用Postman测试需要授权的接口问题
Jun 21 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
教你如何快捷的使用cmd访问mysql小技巧
2014/05/26 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
深入解析PHP的Yii框架中的缓存功能
2016/03/29 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
jQuery常见开发技巧详细整理
2013/01/02 Javascript
JS输入用户名自动显示邮箱后缀列表的方法
2015/01/27 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
2018/09/12 Javascript
微信小程序实现发送验证码按钮效果
2018/12/20 Javascript
Python文档生成工具pydoc使用介绍
2015/06/02 Python
python获取txt文件词向量过程详解
2019/07/05 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
python 按钮点击关闭窗口的实现
2020/03/04 Python
python实现画图工具
2020/08/27 Python
python cookie反爬处理的实现
2020/11/01 Python
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
客户代表实习人员自我鉴定
2013/09/27 职场文书
股权转让协议书
2014/04/12 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
Java使用jmeter进行压力测试
2021/07/09 Java/Android
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers
Redis过期数据是否会被立马删除
2022/07/23 Redis