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 相关文章推荐
解决Maven项目中 Invalid bound statement 无效的绑定问题
Jun 15 Java/Android
Spring Boot 启动、停止、重启、状态脚本
Jun 26 Java/Android
Java中多线程下载图片并压缩能提高效率吗
Jul 01 Java/Android
swagger如何返回map字段注释
Jul 03 Java/Android
java设计模式--七大原则详解
Jul 21 Java/Android
OpenCV实现反阈值二值化
Nov 17 Java/Android
JavaCV实现照片马赛克效果
Jan 22 Java/Android
JVM之方法返回地址详解
Feb 28 Java/Android
剑指Offer之Java算法习题精讲二叉树专项训练
Mar 21 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
Netty分布式客户端处理接入事件handle源码解析
Mar 25 Java/Android
spring IOC容器的Bean管理XML自动装配过程
May 30 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学习 运算符与运算符优先级
2008/06/15 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
PHP过滤★等特殊符号的正则
2014/01/27 PHP
CI框架表单验证实例详解
2016/11/21 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
JS简单获取日期相差天数的方法
2017/04/24 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
2019/05/03 Javascript
JavaScript实现动态留言板
2020/03/16 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
Python字符串的encode与decode研究心得乱码问题解决方法
2009/03/23 Python
python批量同步web服务器代码核心程序
2014/09/01 Python
整理Python中的赋值运算符
2015/05/13 Python
python中argparse模块用法实例详解
2015/06/03 Python
python记录程序运行时间的三种方法
2017/07/14 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
标准导师推荐信(医学类)
2013/10/28 职场文书
人大代表选举标语
2014/10/07 职场文书
借条如何写
2015/05/26 职场文书
Python数据分析之绘图和可视化详解
2021/06/02 Python
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP