用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属性。
假设我门有个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}
以上就是极悦小编介绍的"MyBatis更新获取update记录",希望对大家有帮助,想了解更多可查看Mybatis基础教程,如有疑问,请在线咨询,有专业老师随时为您服务。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习