Mybatis是对JDBC的封装,也就相当于JDBC update到底返回的是什么?

不就是返回更新的条数吗?我为什么会问这个问题呢?因为一次在navicat执行sql,偶然发现的。然后自己就去研究了一番。

下列一个用户表(user[id,age,name])

id age name
1 25 李彤
2 24 丽云
3 23 盼盼
1
2
3
4
5
6
update user set age = 23 where id = 2;

navicat 返回
[SQL]update user set age = 23 where id = 2;
受影响的行: 0
时间: 0.044s

我当时突然一诧,按我当时的理解,不是应该只要匹配了就更新吗?那这个受影响的行为0是什么鬼。进而想到项目中很多时候根据更新返回的结果判断是否成功,如果和navicat一样,那不就是说很多时候结果并不准确吗。

我马上试一下,结果和我之前的观点一致,返回的1,那又是怎么回事呢?

JDBC规范规定update是匹配的行数,实际上更不更新数据库之间可能并不相同,JDBC也不关心,所以我们在项目中根据update的返回结果判断是否成功是正确的。

1
2
3
4
5
update 语句天然可以作为分布式锁,一般应用在非大型项目上。
eg:
int updateXXXStatus(@Param("Integer") Integrt id, @Param("fromStatus") int fromStatus, @Param("toStatus") int toStatus);

update table_name set status = #{toStatus}[,...] where id = #{id} and status = #{fromStatus} [and is_deleted = false and ...];

Mysql协议OKPacket包,实际上并不直接返回匹配的行数。

可以看到mysql直接返回 Affect Rows,即更新的条数。而匹配的条数却是在Message中以文本返回的。其实通过命令行执行,其实可以看到这个信息的,navicat却给隐藏了。

1
2
3
4
5
update user set age = 23 where id = 2;

mysql 命令行 返回
Query OK, 0 rows affected (0.05 sec)
Rows matched: 1 Changed: 0 Warnings: 0

Java 代码断点调试:

okPacket.png

通过这件事更加明白细心的重要性,往往小细节,隐藏着很多信息。同时更应该知道工具虽好,但是可能会隐藏一些重要信息。



Mybatis      java mybatis

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!