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 属性。
写更新语句,并将更新的纪录的ID 返回出来。 通过 test 的name 去更新 test 的email,并获取被更新纪录的id。
<update id="updateByUserName" parameterType="com.test.model.User">
<selectKey keyProperty='id' resultType='int' order='BEFORE'>
SELECT
(select id FROM test WHERE
name = #{name})id
from DUAL
</selectKey>
UPDATE test SET
email=#{email}
WHERE
name =#{name}
</update>
上述代码就是通过 selectKey 实现了 通过 test 的name 去更新 test 的email,并获取被更新纪录的id。
原理
<selectKey keyProperty='id' resultType='int' order='BEFORE'>
此处的 keyProperty=’id’ 是指将查询出来的id 映射到传入updateByUserName 的test 的id 。类型为int 因为可能查到name 以后可能会修改name 所以order=’BEFORE’ 要在执行update之前进行查询,并把id返回出来。 SELECT (select id FROM test WHERE name = #{name})id from DUAL 此 SELECT 就是为了获取 被更新的 test的id 外边包装一个虚表查询是当 name = #{name} 查询不到纪录时不会报空纪录,会返回 null ,这个就很关键了。 当返回空记录的时候 mybatis会报错,说不能转换成 int 型。 当返回null的时候就会转换成int 的 0 。不会报错,代表没有查到。
- 【java开发系列】—— Tomcat编译报错
- java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
- 《像计算机科学家一样思考Java》—— 读后总结
- 记录安装oracle的那些事(三)之oracle Database R2安装
- Elasticsearch Javascript API增删改查
- Oracle二三事之 Oracle SPARC SuperCluster的九大技术优势
- 两个 viewports 的故事-第二部分
- 通过 JS 实现简单的拖拽功能并且可以在特定元素上禁止拖拽
- AngularJS 技术总结
- 《linux c编程指南》学习手记5
- AngularJS API之bootstrap启动
- 通过 JS 判断页面是否有滚动条的简单方法
- Log4j官方文档翻译(六、日志的级别)
- AngularJS API之isXXX()
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- pytest 测试框架学习(9):pytest.main
- 深入了解ActiveMQ!
- 完美解决 python ImportError: Failed to import any qt binding
- 爬取娱乐圈排行榜数据
- 如何解决Linux系统下pyaudio安装缺少文件问题error: portaudio.h: 没有那个文件或目录
- pytest 测试框架学习(10):pytest.param
- pytest 测试框架学习(11):pytest.raises
- Hibernate第二天:Hibernate的一级缓存、其他的API
- pytest 测试框架学习(12):pytest.deprecated_call
- Pinstaller(Python打包为exe文件
- pytest 测试框架学习(14):pytest.warns
- ImportError: /lib64/libm.so.6: version `CXXAB_1.3.8.' not found (required by /usr/local/python37/lib
- pytest 测试框架学习(15):pytest.freeze_includes
- Linux: scp文件,目录上传下载标准版
- Hibernate第三天:Hibernate的一对多配置、Hibernate的多对多的配置