Mybatis是对JDBC的封装,也就相当于JDBC update到底返回的是什么?
不就是返回更新的条数吗?我为什么会问这个问题呢?因为一次在navicat执行sql,偶然发现的。然后自己就去研究了一番。
下列一个用户表(user[id,age,name])
id | age | name |
---|---|---|
1 | 25 | 李彤 |
2 | 24 | 丽云 |
3 | 23 | 盼盼 |
1 | update user set age = 23 where id = 2; |
我当时突然一诧,按我当时的理解,不是应该只要匹配了就更新吗?那这个受影响的行为0是什么鬼。进而想到项目中很多时候根据更新返回的结果判断是否成功,如果和navicat一样,那不就是说很多时候结果并不准确吗。
我马上试一下,结果和我之前的观点一致,返回的1,那又是怎么回事呢?
JDBC规范规定update是匹配的行数,实际上更不更新数据库之间可能并不相同,JDBC也不关心,所以我们在项目中根据update的返回结果判断是否成功是正确的。
1 | update 语句天然可以作为分布式锁,一般应用在非大型项目上。 |
Mysql协议OKPacket包,实际上并不直接返回匹配的行数。
可以看到mysql直接返回 Affect Rows,即更新的条数。而匹配的条数却是在Message中以文本返回的。其实通过命令行执行,其实可以看到这个信息的,navicat却给隐藏了。
1 | update user set age = 23 where id = 2; |
Java 代码断点调试:
通过这件事更加明白细心的重要性,往往小细节,隐藏着很多信息。同时更应该知道工具虽好,但是可能会隐藏一些重要信息。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!