久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

145次閱讀
沒有評論

共計 2629 個字符,預計需要花費 7 分鐘才能閱讀完成。

本篇內容主要講解“mysql 中 update 語句返回的結果是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“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 語句,屏幕上顯示其實是這樣的:

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

證實

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

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

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

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

1,建立 Connection

根據源碼,追蹤,在 mysql 建立 connection 的時候,會將 useAffectedRows=true 這個參數設置為 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 版本,位置不一樣)。

設置完成之后:

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 語句返回的結果是什么”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計2629字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 汝阳县| 板桥市| 浦城县| 凤阳县| 永和县| 郴州市| 永春县| 清苑县| 岗巴县| 吉安市| 台东县| 永康市| 安康市| 科技| 团风县| 和田县| 黔南| 辉南县| 长岭县| 饶河县| 老河口市| 得荣县| 陵川县| 长治市| 扎囊县| 怀安县| 邢台县| 邻水| 通山县| 壶关县| 义马市| 双鸭山市| 泗洪县| 天全县| 晋城| 当涂县| 荔浦县| 张家川| 林西县| 赣州市| 余庆县|