mysql中update語句的回傳結果:1、當資料庫的url中沒有「useAffectedRows=true」參數時,傳回符合行數;2、當資料庫的url中有「useAffectedRows=true」參數時,傳回影響行數。
本教學操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。
update語句的結果到底是符合行數?還是影響行數?
先說結果:如果資料庫的url為:
jdbc:mysql://gitlab.fzghjx.com:3306/cron
則,傳回結果為匹配行數(Rows matched)。
若為:
jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true
則傳回的是影響行數(Changed)。
綜上:
如果url中沒有 useAffectedRows=true 這個參數,則回傳的就是符合行數。如果有,則傳回的是影響行數。
如何讓其傳回值為受影響(changed)的記錄數呢?
只需在mysql資料連接url參數加useAffectedRows=true即可
jdbc.url=jdbc:mysql://localhost:3306/ssm?useAffectedRows=true
擴充知識:
猜想
如果透過cmd操作mysql的update語句,螢幕上顯示其實是這樣的:
#當我想這個問題的時候,第一反應有兩個答案,1,在mysql伺服器的回傳結果中,進行判斷,如果有這個設定為true,則傳回Rows matched的值,如果為false,則傳回Changed的值。 2,在傳回給查詢語句的時候,進行這個值的選擇。
證實
借用一個圖表來說明建立connection的整個過程:
##(圖片摘自:https://blog.csdn.net/c929833623lvcha/article/details/44517245)##當我研究了一段時間之後,我發現,這兩種想法都錯了。具體來看:我寫了一個簡單的jdbc查詢:
1,建立Connection
這個參數設定為connection的屬性。 在
Connection connection = DriverManager.getConnection("jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true", "root", "root");
往下追蹤:
#繼續:connect方法為:java.sql.Driver#connect,實作為: com.mysql.jdbc.NonRegisteringDriver#connect
useAffectedRows=true是在com.mysql.jdbc.NonRegisteringDriver#parseURL方法讀取,並設定到 Properties props中去的。
再往下:com.mysql.jdbc.ConnectionImpl#getInstance取得connectiong的實例
##這裡是一個反射,args為 JDBC_4_CONNECTION_CTOR
用到的是JDBC的建構子:
JDBC的建構函數,是:
public JDBC4Connection(String hostToConnectTo, int portToConnectTo, Properties info, String databaseToConnectTo, String url) throws SQLException { super(hostToConnectTo, portToConnectTo, info, databaseToConnectTo, url); }往上找,是ConnectionImp的建構子:
(順便一提:這裡設定了交易的隔離等級為2,讀取已提交)
在這個建構子裡,將 useAffectedRows的值初始化到connection中去了:
這裡有206個屬性要設置,useAffectedRows排在190位(不同的mysql-connect -java版本,位置不一樣)。
設定完成之後:2,建立MysqlIO
設定完屬性之後,就要建立MysqlIO了:這裡有一個「高可用」的選項,如果是的話,就會建立一個重試的IO連結。否則,則創建一個只嘗試一次的IO鏈接,失敗了就不會重試。這個選項,也是在url中,透過設定:autoReconnect=true來開啟的。
連接IO過程,其實就是創建一個MysqlIO,然後開始握手:
##重點來了:在doHandshake方法中,設定了useAffectedRows的選項:(com.mysql.jdbc.MysqlIO#doHandshake) 這個CLIENT_FOUND_ROWS的值為:##這個CLIENT_FOUND_ROWS的值為:
也就是低位的倒數第二位的值進行或運算。如果useAffectsRows,則不會進行
或操作。
設定完之後,透過mysqlOutput的socket傳送給mysql 伺服器:
mysqlOutput來源:在MysqlIO建置的時候建立的。
4,封包分析:
useAffectedRows=true時:傳送請求給mysql伺服器:
mysql伺服器的回應:
useAffectedRows=false時:
發送請求給mysql伺服器:
##mysql伺服器的回應:
從以上封包可以看出,當useAffectedRows為true和false時,msyql伺服器的回傳值是不同的
。最後jdbc取的回傳結果,就是封包中,Affected Rows的值 。直接從msyql的結果中獲取,jdbc只是對結果進行了一些解析和過濾。由此證明,最開始的猜想是錯的。推薦學習:mysql影片教學
####以上是mysql中update語句回傳什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!