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新手教程之ArrayList的基本使用
Jun 20 Java/Android
基于Java的MathML转图片的方法(示例代码)
Jun 23 Java/Android
实体类或对象序列化时,忽略为空属性的操作
Jun 30 Java/Android
小程序与后端Java接口交互实现HelloWorld入门
Jul 09 Java/Android
解决persistence.xml配置文件修改存放路径的问题
Feb 24 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Apr 07 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
Jun 01 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
Jun 25 Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 Java/Android
app场景下uniapp的扫码记录
Jul 23 Java/Android
Java中的Kafka为什么性能这么快及4大核心详析
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的explode和implode的使用说明
2011/07/17 PHP
php导入导出excel实例
2013/10/25 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
jQuery下的动画处理总结
2013/10/10 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
mpvue将vue项目转换为小程序
2018/09/30 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
python获取指定网页上所有超链接的方法
2015/04/04 Python
python基于ID3思想的决策树
2018/01/03 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
2020/10/19 Python
J2EE面试题集锦(附答案)
2013/08/16 面试题
特色蛋糕店创业计划书
2014/01/28 职场文书
《乞巧》教学反思
2014/02/27 职场文书
歌唱比赛主持词
2014/03/18 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js