本文是轉帖,爲了找到解決的方法,百度了好多都沒找到,最後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語句 的匹配行數。