本文是转帖,为了找到解决的方法,百度了好多都没找到,最后Google嗖的一下就找到了,我也是无语心累java
感谢原文做者mysql
MySQL
当执行一句update语句,但修改内容与原数据一致时,mysql本神返回的 受影响行数为0 ,在 控制台或者 客户端如navicat中均可看到
但jdbc/mybatis 返回的倒是1,返回的是 sql语句 的匹配行数。spring
Oracle直接返回1条记录被更新。sql
因此很明显,不一样数据update的机制是不同的。数据库
可是针对标准SQL,不涉及具体数据库,update t_order set order_mark = 2 where order_id=1555确定是会操做一条记录,因此你能够理解经过jdbc执行update返回的是操做记录数,而不是影响记录数服务器
使用spring,mbatis更新数据时若是数据先后相同,会返回1
在使用客户端时,若是数据相同,返回值为0
返回不同,不知道为何会是这样?
找到缘由了
Found MySQL specific workaround. If someone is curious - useAffectedRows option for jdbc url, e.g.
jdbc:mysql://${jdbc.host}/${jdbc.db}?useAffectedRows=truemybatis
useAffectedRows的含义 :是否用受影响的行数替代查找到的行数来返回数据,也就是查找到了 但却不必定真正修改了多线程
JDBC默认返回的是符合的行数Rows matched, 若是想返回修改过( Changed)的行数 ,须要使用useAffectedRows参数
附上该参数修改方式:
遇到MySQL中on duplicate key update语句返回值不正确:
在server5.1.*的返回分别为insert=1,update=3,nochange=2
在server5.5.*的返回分别为insert=1,update=2,nochange=1
应返回:insert=1,update=2,nochange=0
使用mysql-connector-java-*.jar不当致使。修正为:jdbc:mysql://ip:port/db?useAffectedRows=true&…
useAffectedRows的含义 :是否用受影响的行数替代查找到的行数来返回数据,也就是查找到了 但却不必定真正修改了函数
其余常见经常使用参数:
UsePerformanceMonitor,userperfmon, perfmon:是否启用性能监视,默认 false
IgnorePrepare: 是否忽略 Prepare() 调用,默认 true
UseProcedureBodies,procedure bodies:是否检查存储过程体、参数的有效性,默认 true
AutoEnlist: 是否自动使用活动的链接,默认 true
TreatTinyAsBoolean:是否将 TINYINT(1) 列视为布尔型,默认 true
AllowUserVariables:是否容许 SQL 中出现用户变量,默认 false
FunctionsReturnString:全部服务器函数是否按返回字符串处理,默认 false
UseAffectedRows:是否用受影响的行数替代查找到的行数来返回数据,默认 false
Keepalive: 保持 TCP 链接的秒数,默认0,不保持。
ConnectionLifeTime:链接被销毁前在链接池中保持的最少时间(秒)。默认 0
Pooling: 是否使用线程池,默认 true
MinimumPoolSize, min pool size:线程池中容许的最少线程数,默认 0
MaximumPoolSize,max pool size:线程池中容许的最多线程数,默认 100
ConnectionReset:链接过时后是否自动复位,默认 false
CharacterSet, charset:向服务器请求链接所使用的字符集,默认:无性能
当执行一句update语句,但修改内容与原数据一致时,mysql本神返回的 受影响行数为0 ,在 控制台或者 客户端如navicat中均可看到
但jdbc/mybatis 返回的倒是1,返回的是 sql语句 的匹配行数。