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集成swagger文档组件
Jun 28 Java/Android
JavaWeb 入门篇(3)ServletContext 详解 具体应用
Jul 16 Java/Android
Spring Cloud 中@FeignClient注解中的contextId属性详解
Sep 25 Java/Android
springboot 多数据源配置不生效遇到的坑及解决
Nov 17 Java/Android
springmvc直接不经过controller访问WEB-INF中的页面问题
Feb 24 Java/Android
关于ObjectUtils.isEmpty() 和 null 的区别
Feb 28 Java/Android
JavaScript正则表达式实现注册信息校验功能
May 30 Java/Android
解决spring.thymeleaf.cache=false不起作用的问题
Jun 10 Java/Android
ConditionalOnProperty配置swagger不生效问题及解决
Jun 14 Java/Android
SpringBoot详解自定义Stater的应用
Jul 15 Java/Android
OpenFeign实现远程调用
Aug 14 Java/Android
Java结构型设计模式之组合模式详解
Sep 23 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安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
PHP检测链接是否存在的代码实例分享
2016/05/06 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
Laravel框架自定义分页样式操作示例
2020/01/26 PHP
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
数组方法解决JS字符串连接性能问题有争议
2011/01/12 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
javascript实现设置、获取和删除Cookie的方法
2015/06/01 Javascript
jQuery基于ajax实现星星评论代码
2015/08/07 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
python中enumerate的用法实例解析
2014/08/18 Python
Python实现多线程抓取妹子图
2015/08/08 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
python计算列表内各元素的个数实例
2018/06/29 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
基于Python爬虫采集天气网实时信息
2020/06/05 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
英国旅游额外服务市场领导者:Holiday Extras(机场停车场、酒店、接送等)
2017/10/07 全球购物
SQL Server面试题
2016/10/17 面试题
个人收入证明范本
2014/01/12 职场文书
总经理司机职责
2014/02/02 职场文书
期中考试反思800字
2014/05/01 职场文书
个人收入证明范本
2015/06/12 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书