Mybatis更新操作返回值问题

  

后端的数据持久化使用的是Mybatis,在做高并发下账户增减余额的时候,打算使用乐观锁来解决这个问题。在获取更新操作的返回值时遇到了一个问题,似乎Mybatis进行更新操作得到的int返回值并不是影响的行数。这下就尴尬了。

  

一般而言,我们知道当我们使用Mybatis在映射器接口中定义插入删除等操作,定义一个int类型的返回值,通过该值是否为0来判断数据库中受影响的行数进而判断操作是否成功。

  

到底更新返回值代表什么呢?我们来验证一下便知道了,假设有如下一张表以及两条数据:

  

癕ybatis更新操作返回值问题"

  

我们来编写一个简单的单元测试用例来验证下,首先使用mybatis简单的写个映射进行更新操作,其中xml中的内容为:

  

癕ybatis更新操作返回值问题"

  

  

  

接来下,我们来编写一个简单的单元测试来验证下:更新的返回值是不是受影响的记录的条数,对应的单元测试代码如下:

  

癕ybatis更新操作返回值问题"

  

由单元测试代码可以得知,我们将要把数据库中两条记录的手机字段的值由12345678修改为66666666,正常情况下,resultCode将会返回2。因为更新操作影响到数据库中这2条记录,这和我们期望2是相符合的。那么一切正常的情况下,这次单元测试将会通过,那么我们运行看看结果:

  

癕ybatis更新操作返回值问题"

  

单元测试通过了,再查看数据库中的记录:

  

癕ybatis更新操作返回值问题"

  

这说明mybatis的更新更新操作返回值的确是返回受影响的行数……真的是这样吗?

  

癕ybatis更新操作返回值问题"

  

我们知道,当数据库中的记录被修改之后,再次执行重复的更新操作将不会影响到新的行数,为了验证我说的话,我们试试:

  

癕ybatis更新操作返回值问题"

  

那么,按照这个逻辑:我们再次执行这个单元测试应该是,resultCode返回的应该是0,和我们的期望的数字2不一致,将会导致测试不通过。再次运行单元测试:

  

癕ybatis更新操作返回值问题"

  

居然还是过去了,看到这里聪明的你已经看出来了,默认情况下,mybatis的更新操作返回值是记录的匹配的条数,并不是影响的记录条数。

  

严格意义上来将,这并不是mybatis的返回值,mybatis仅仅只是返回的数据库连接驱动(通常是JDBC)的返回值,也就是说,如果驱动告知更新2条记录受影响,那么我们将得到mybatis的返回值就会是2和mybatis本身是没有关系的。

  

道理我都懂,如果我们非得要mybatis的更新操作明确的返回受影响的记录条数,有没有什么办法呢?

  

当然是有的。

  

通过对JDBC URL显式的指定useAffectedRows选项,我们将可以得到受影响的记录的条数:

        jdbc: mysql://$ {jdbc.host}/$ {jdbc.db} & # 63; useAffectedRows=true      

我们对我们的数据库连接配置稍做修改,添加useAffectedRows字段:

  

癕ybatis更新操作返回值问题"

  

此时,mybatis的更新操作返回的应该是受影响的条数了,我们再次运行单元测试试试看:

  

癕ybatis更新操作返回值问题"

  

更新操作返回的是受影响的记录条数,我们知道为0和我们预期的2不一致,自然而然单元测试不通过咯~。

  

  

以上所述是小编给大家介绍的Mybatis更新操作返回值问题,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

Mybatis更新操作返回值问题