mysql 连接参数 useAffectedRows -- update返回的受影响行数不准确

以下内容摘自:https://www.jianshu.com/p/80270b93082a

如果定义一个如下的update函数,那么这个函数的返回值到底是啥意思呢?是受影响的行数吗?

函数定义

验证之前我们先看看数据库中的数据记录。总共两条数据记录!

mysql 连接参数 useAffectedRows -- update返回的受影响行数不准确_第1张图片

数据库链接配置为:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=123456

下面看看我们的单元测试类。

mysql 连接参数 useAffectedRows -- update返回的受影响行数不准确_第2张图片

我们根据 ID 获取记录,然把用户名由 root 改为 root001。如果说返回值是影响的行数的话,那么应该返回 1.跟我们的预期结果 1 是相符的。单元测试会通过。mysql 连接参数 useAffectedRows -- update返回的受影响行数不准确_第3张图片

单元测试通过,我们看看数据库中的记录有没有变化。

mysql 连接参数 useAffectedRows -- update返回的受影响行数不准确_第4张图片

看起来貌似没有任何问题。单元测试通过,数据库的确是只有一条记录更改了。这说明 mybatis 的 update 操作返回值的确是受影响的行数。

真的是这样吗

我们知道当数据库中的记录被修改之后,我们在次执行相同的 update 语句将不会影响到数据记录行数。

按照这个逻辑来讲的话,在此执行此单元测试,返回值应该为 0,跟我们的预期值 1 不同,单元测试应该不通过。再次运行单元测试:mysql 连接参数 useAffectedRows -- update返回的受影响行数不准确_第5张图片

单元测试通过

我去,单元测试居然神奇般的通过了。。。请注意看,我们在命令行执行 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

再次运行单元测试:

mysql 连接参数 useAffectedRows -- update返回的受影响行数不准确_第6张图片

单元测试失败

从报错信息可以清晰的看出,返回值是 0,跟我们的预期值 1 不同。


以下内容摘自:https://blog.csdn.net/qq_15071263/article/details/81662725

1、官方介绍

useAffectedRows

Don’t set the CLIENT_FOUND_ROWS flag when connecting to the server (not JDBC-compliant, will break most applications that rely on “found” rows vs. “affected rows” for DML statements), but does cause “correct” update counts from “INSERT … ON DUPLICATE KEY UPDATE” statements to be returned by the server.

Default: false

Since version: 5.1.7

2、翻译

参数名称 [使用受影响的行的数量进行返回]
当连接到服务器(不符合JDBC)时,不要设置clitNyFuffy行标记,它会破坏依赖于“找到”行与“DML语句的“受影响行”的大多数应用程序),但会导致“插入”的“正确”更新计数。关于由服务器返回的重复密钥更新语句。

寻求帮助后的人工翻译: 
当连接到服务器时不要设置“client_found_rows”标签 (这个是不符合JDBC标准的,它会破坏大部分依赖“found”VS DML语句下的”affected”应用程序)。但是会导致“insert”里面的“Correct”更新数据。服务器会返回“ON Duplicate Key update”的状态

默认值: 不使用受影响的行的数量进行返回,而是返回找到的行的数量值 
具体场景:当该值是false时,执行【UPDATE】语句,在该【UPDATE】的条件下可以找到3条记录,但是实际上只更新了2条数据,因为第三条数据将要修改的值与原来的值相同,则该【UPDATE】语句会返回3、而有时候我们希望他返回2、则设置该参数值为 TRUE 
从哪个版本开始有这个参数:5.1.7

你可能感兴趣的:(mysql,mybatis)