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内存模型之happens-before概念详解
Jun 13 Java/Android
详解Java实践之抽象工厂模式
Jun 18 Java/Android
利用Java设置Word文本框中的文字旋转方向的实现方法
Jun 28 Java/Android
Java 数组内置函数toArray详解
Jun 28 Java/Android
浅谈resultMap的用法及关联结果集映射
Jun 30 Java/Android
分析ZooKeeper分布式锁的实现
Jun 30 Java/Android
Java 语言中Object 类和System 类详解
Jul 07 Java/Android
mybatis中注解与xml配置的对应关系和对比分析
Aug 04 Java/Android
JPA 通过Specification如何实现复杂查询
Nov 23 Java/Android
spring注解 @PropertySource配置数据源全流程
Mar 25 Java/Android
Java后端 Dubbo retries 超时重试机制的解决方案
Apr 14 Java/Android
Java设计模式中的命令模式
Apr 28 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设计模式 Builder(建造者模式)
2011/06/26 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
yii2中的rules 自定义验证规则详解
2016/04/19 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
Javascript使用post方法提交数据实例
2015/08/03 Javascript
JavaScript入门基础
2015/08/12 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
Vue.js之slot深度复制详解
2017/03/10 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
windows下安装python paramiko模块的代码
2013/02/10 Python
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
Python中正则表达式的用法总结
2019/02/22 Python
python try 异常处理(史上最全)
2019/03/07 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
2020/07/14 Python
中医药大学毕业生自荐信
2013/11/08 职场文书
店面销售职位的职责
2014/03/09 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
住房抵押登记委托书
2014/09/27 职场文书
电工生产实习心得体会
2016/01/22 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers
修改MySQL的默认密码的四种小方法
2021/05/26 MySQL
python数据处理之Pandas类型转换
2022/04/28 Python
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS