Mybatis Update操作返回值问题
如果定义一个如下的update
函数,那么这个函数的返回值到底是啥意思呢?是受影响的行数吗?
![](http://upload-images.jianshu.io/upload_images/1987914-c00407eb8855286f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/633/format/webp)
函数定义
验证之前我们先看看数据库中的数据记录。总共两条数据记录!
![](http://upload-images.jianshu.io/upload_images/1987914-c1c579072a0fc78b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/271/format/webp)
数据记录
数据库链接配置为:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=123456
下面看看我们的单元测试类。
![](http://upload-images.jianshu.io/upload_images/1987914-27b65c70072c499c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/538/format/webp)
单元测试类
我们根据 ID 获取记录,然把用户名由 root 改为 root001。如果说返回值是影响的行数的话,那么应该返回 1.跟我们的预期结果 1 是相符的。单元测试会通过。
![](http://upload-images.jianshu.io/upload_images/1987914-7b69bb9971ab44e8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
单元测试通过
单元测试通过,我们看看数据库中的记录有没有变化。
![](http://upload-images.jianshu.io/upload_images/1987914-1bf2e6d49949dcc5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/296/format/webp)
数据库记录
看起来貌似没有任何问题。单元测试通过,数据库的确是只有一条记录更改了。这说明 mybatis 的 update 操作返回值的确是受影响的行数。
真的是这样吗
我们知道当数据库中的记录被修改之后,我们在次执行相同的 update 语句将不会影响到数据记录行数。
![](http://upload-images.jianshu.io/upload_images/1987914-736e8c546fc62403.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/708/format/webp)
按照这个逻辑来讲的话,在此执行此单元测试,返回值应该为 0,跟我们的预期值 1 不同,单元测试应该不通过。再次运行单元测试:
![](http://upload-images.jianshu.io/upload_images/1987914-7edea70011953f86.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
单元测试通过
我去,单元测试居然神奇般的通过了。。。请注意看,我们在命令行执行 update 语句那张图,返回的 matched 数量为 1。所以默认情况下,mybatis 的 update 操作的返回值是 matched 的记录数,并不是受影响的记录数。
那么有没有办法让 mybatis 的 update 操作的返回值是受影响的行数呢。因为我们业务逻辑中有时会根据这个返回值做业务判断。答案当然是有的。
修改数据库链接配置为:增加了 useAffectedRows 字段信息。
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useAffectedRows=true
jdbc.username=root
jdbc.password=123456
再次运行单元测试:
![](http://upload-images.jianshu.io/upload_images/1987914-60dfe3b77fda04ad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/993/format/webp)
单元测试失败
从报错信息可以清晰的看出,返回值是 0,跟我们的预期值 1 不同。