中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql中update語句返回的結果是什么

發布時間:2022-05-19 16:38:57 來源:億速云 閱讀:2033 作者:iii 欄目:MySQL數據庫

本篇內容主要講解“mysql中update語句返回的結果是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“mysql中update語句返回的結果是什么”吧!

mysql中update語句的返回結果:1、當數據庫的url中沒有“useAffectedRows=true”參數時,返回匹配行數;2、當數據庫的url中有“useAffectedRows=true”參數時,返回影響行數。

本教程操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。

mysql中update語句返回什么

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語句,屏幕上顯示其實是這樣的:

mysql中update語句返回的結果是什么

當我想這個問題的時候,第一反應有兩個答案,1,在mysql服務器的返回結果中,進行判斷,如果有這個設置為true,則返回Rows matched的值,如果為false,則返回Changed的值。2,在返回給查詢語句的時候,進行這個值的選擇。

證實

借用一個圖來說明創建connection的整個過程:

mysql中update語句返回的結果是什么

(圖摘自:https://blog.csdn.net/c929833623lvcha/article/details/44517245)

當我研究了一段時間之后,我發現,這兩種想法都錯了。具體來看:

我寫了一個簡單的jdbc查詢:

mysql中update語句返回的結果是什么

1,建立Connection

根據源碼,追蹤,在mysql建立connection的時候,會將useAffectedRows=true這個參數設置為connection的屬性。

Connection connection = DriverManager.getConnection("jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true", "root", "root");

往下追蹤:

mysql中update語句返回的結果是什么

繼續:connect方法為:java.sql.Driver#connect,實現為:com.mysql.jdbc.NonRegisteringDriver#connect

mysql中update語句返回的結果是什么

useAffectedRows=true就是在com.mysql.jdbc.NonRegisteringDriver#parseURL方法中讀取,并設置到  Properties props中去的。

再往下:com.mysql.jdbc.ConnectionImpl#getInstance獲取connectiong的實例

mysql中update語句返回的結果是什么

這里是一個反射,args為  JDBC_4_CONNECTION_CTOR   用到的是JDBC的構造函數:

mysql中update語句返回的結果是什么

JDBC的構造函數,是:

public JDBC4Connection(String hostToConnectTo, int portToConnectTo, Properties info, String databaseToConnectTo, String url) throws SQLException {
    super(hostToConnectTo, portToConnectTo, info, databaseToConnectTo, url);
}

往上找,是ConnectionImp的構造函數:

mysql中update語句返回的結果是什么

(順便提一句:這里設置了事務的隔離級別為2,讀已提交)

mysql中update語句返回的結果是什么

在這個構造函數里,將  useAffectedRows的值初始化到connection中去了:

mysql中update語句返回的結果是什么

這里有206個屬性要設置,useAffectedRows排在190位(不同的mysql-connect-java版本,位置不一樣)。

設置完成之后:

mysql中update語句返回的結果是什么

2,創建MysqlIO

設置完屬性之后,就要創建MysqlIO了:

mysql中update語句返回的結果是什么

mysql中update語句返回的結果是什么

這里有一個“高可用”的選項,如果是的話,就會創建一個重試的IO鏈接。否則,則創建一個只嘗試一次的IO鏈接,失敗了就不會重試。這個選項,也是在url中,通過設置:autoReconnect=true來開啟的。

3,與msyql服務器握手連接

連接IO過程,其實就是創建一個MysqlIO,然后開始握手:

mysql中update語句返回的結果是什么

重點來了:在doHandshake方法中,設置了useAffectedRows的選項:(com.mysql.jdbc.MysqlIO#doHandshake)

mysql中update語句返回的結果是什么

這個CLIENT_FOUND_ROWS的值為:

mysql中update語句返回的結果是什么

也就是低位的倒數第二位的值進行操作。如果useAffectsRows,則不會進行操作。

設置完之后,通過mysqlOutput的socket發送給mysql 服務器:

mysql中update語句返回的結果是什么

mysqlOutput來源:在MysqlIO構建的時候創建的。

mysql中update語句返回的結果是什么

ok,這是一個簡單的過程。接下來,來看tcp的報文:

4,報文分析:

useAffectedRows=true時:

發送請求給mysql服務器:

mysql中update語句返回的結果是什么

mysql服務器的響應:

mysql中update語句返回的結果是什么

useAffectedRows=false時:

發送請求給mysql服務器:

mysql中update語句返回的結果是什么

mysql服務器的響應:

mysql中update語句返回的結果是什么

從以上報文可以看出,useAffectedRows為true和false時,msyql服務器的返回值是不同的。最后jdbc取的返回結果,就是報文中,Affected Rows的值 。直接從msyql的結果中獲取,jdbc只是對結果進行了一些解析和過濾。由此證明,最開始的猜想是錯的。

到此,相信大家對“mysql中update語句返回的結果是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

徐闻县| 贡嘎县| 武清区| 高清| 大丰市| 临湘市| 远安县| 张家界市| 新干县| 新安县| 闽侯县| 板桥市| 塔河县| 岑溪市| 彰化县| 开鲁县| 高密市| 航空| 四平市| 商河县| 株洲县| 永寿县| 肇东市| 凤台县| 于都县| 胶南市| 漳浦县| 龙江县| 平谷区| 安顺市| 揭阳市| 绥中县| 阿克陶县| 沐川县| 章丘市| 南丰县| 盐山县| 桓台县| 若羌县| 隆安县| 兴宁市|