站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

mysql中update語(yǔ)句返回什么

mysql中update語(yǔ)句的返回結(jié)果:1、當(dāng)數(shù)據(jù)庫(kù)的url中沒(méi)有“useAffectedRows=true”參數(shù)時(shí),返回匹配行數(shù);2、當(dāng)數(shù)據(jù)庫(kù)的url中有“useAffectedRows=true”參數(shù)時(shí),返回影響行數(shù)。

mysql中update語(yǔ)句返回什么

本教程操作環(huán)境:windows10系統(tǒng)、mysql8.0.22版本、Dell G3電腦。

mysql中update語(yǔ)句返回什么

update語(yǔ)句的結(jié)果到底是匹配行數(shù)?還是影響行數(shù)?

先說(shuō)結(jié)果:如果數(shù)據(jù)庫(kù)的url為:

jdbc:mysql://gitlab.fzghjx.com:3306/cron

則,返回結(jié)果為匹配行數(shù)(Rows matched)。

若為:

jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true

則返回的是影響行數(shù)(Changed)。

綜上:

如果url中沒(méi)有 useAffectedRows=true 這個(gè)參數(shù),則返回的是匹配行數(shù)。如果有,則返回的是影響行數(shù)。

如何讓其返回值為受影響(changed)的記錄數(shù)呢?

只需在mysql數(shù)據(jù)連接url參數(shù)加useAffectedRows=true即可

jdbc.url=jdbc:mysql://localhost:3306/ssm?useAffectedRows=true

擴(kuò)展知識(shí):

猜想

如果通過(guò)cmd操作mysql的update語(yǔ)句,屏幕上顯示其實(shí)是這樣的:

mysql中update語(yǔ)句返回什么

當(dāng)我想這個(gè)問(wèn)題的時(shí)候,第一反應(yīng)有兩個(gè)答案,1,在mysql服務(wù)器的返回結(jié)果中,進(jìn)行判斷,如果有這個(gè)設(shè)置為true,則返回Rows matched的值,如果為false,則返回Changed的值。2,在返回給查詢(xún)語(yǔ)句的時(shí)候,進(jìn)行這個(gè)值的選擇。

證實(shí)

借用一個(gè)圖來(lái)說(shuō)明創(chuàng)建connection的整個(gè)過(guò)程:

mysql中update語(yǔ)句返回什么

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

當(dāng)我研究了一段時(shí)間之后,我發(fā)現(xiàn),這兩種想法都錯(cuò)了。具體來(lái)看:

我寫(xiě)了一個(gè)簡(jiǎn)單的jdbc查詢(xún):

mysql中update語(yǔ)句返回什么

1,建立Connection

根據(jù)源碼,追蹤,在mysql建立connection的時(shí)候,會(huì)將useAffectedRows=true這個(gè)參數(shù)設(shè)置為connection的屬性。

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

往下追蹤:

mysql中update語(yǔ)句返回什么

繼續(xù):connect方法為:java.sql.Driver#connect,實(shí)現(xiàn)為:com.mysql.jdbc.NonRegisteringDriver#connect

mysql中update語(yǔ)句返回什么

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

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

mysql中update語(yǔ)句返回什么

這里是一個(gè)反射,args為 JDBC_4_CONNECTION_CTOR 用到的是JDBC的構(gòu)造函數(shù):

mysql中update語(yǔ)句返回什么

JDBC的構(gòu)造函數(shù),是:

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

往上找,是ConnectionImp的構(gòu)造函數(shù):

mysql中update語(yǔ)句返回什么

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

mysql中update語(yǔ)句返回什么

在這個(gè)構(gòu)造函數(shù)里,將 useAffectedRows的值初始化到connection中去了:

mysql中update語(yǔ)句返回什么

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

設(shè)置完成之后:

mysql中update語(yǔ)句返回什么

2,創(chuàng)建MysqlIO

設(shè)置完屬性之后,就要?jiǎng)?chuàng)建MysqlIO了:

mysql中update語(yǔ)句返回什么

mysql中update語(yǔ)句返回什么

這里有一個(gè)“高可用”的選項(xiàng),如果是的話(huà),就會(huì)創(chuàng)建一個(gè)重試的IO鏈接。否則,則創(chuàng)建一個(gè)只嘗試一次的IO鏈接,失敗了就不會(huì)重試。這個(gè)選項(xiàng),也是在url中,通過(guò)設(shè)置:autoReconnect=true來(lái)開(kāi)啟的。

3,與msyql服務(wù)器握手連接

連接IO過(guò)程,其實(shí)就是創(chuàng)建一個(gè)MysqlIO,然后開(kāi)始握手:

mysql中update語(yǔ)句返回什么

重點(diǎn)來(lái)了:在doHandshake方法中,設(shè)置了useAffectedRows的選項(xiàng):(com.mysql.jdbc.MysqlIO#doHandshake)

mysql中update語(yǔ)句返回什么

這個(gè)CLIENT_FOUND_ROWS的值為:

mysql中update語(yǔ)句返回什么

也就是低位的倒數(shù)第二位的值進(jìn)行操作。如果useAffectsRows,則不會(huì)進(jìn)行操作。

設(shè)置完之后,通過(guò)mysqlOutput的socket發(fā)送給mysql 服務(wù)器:

mysql中update語(yǔ)句返回什么

mysqlOutput來(lái)源:在MysqlIO構(gòu)建的時(shí)候創(chuàng)建的。

mysql中update語(yǔ)句返回什么

ok,這是一個(gè)簡(jiǎn)單的過(guò)程。接下來(lái),來(lái)看tcp的報(bào)文:

4,報(bào)文分析:

useAffectedRows=true時(shí):

發(fā)送請(qǐng)求給mysql服務(wù)器:

mysql中update語(yǔ)句返回什么

mysql服務(wù)器的響應(yīng):

mysql中update語(yǔ)句返回什么

useAffectedRows=false時(shí):

發(fā)送請(qǐng)求給mysql服務(wù)器:

mysql中update語(yǔ)句返回什么

mysql服務(wù)器的響應(yīng):

mysql中update語(yǔ)句返回什么

從以上報(bào)文可以看出,useAffectedRows為true和false時(shí),msyql服務(wù)器的返回值是不同的。最后jdbc取的返回結(jié)果,就是報(bào)文中,Affected Rows的值 。直接從msyql的結(jié)果中獲取,jdbc只是對(duì)結(jié)果進(jìn)行了一些解析和過(guò)濾。由此證明,最開(kāi)始的猜想是錯(cuò)的。

推薦學(xué)習(xí):mysql視頻教程

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
午夜精品在线视频| 久久99久久99精品免视看动漫| 91精品国产高清久久久久久 | 日韩经典精品无码一区| 99久久久国产精品免费牛牛| 精品不卡一区中文字幕| 国产综合色香蕉精品五月婷| 亚洲精品国产精品乱码在线观看| 日韩精品无码永久免费网站| 久久免费观看国产精品88av| 亚洲国产日韩精品| 精品亚洲456在线播放| 亚洲AV无码精品蜜桃| 久久成人国产精品免费软件| 国产叼嘿久久精品久久| 亚洲AV成人精品一区二区三区| 久久精品九九亚洲精品天堂 | 亚洲欧洲自拍拍偷精品 美利坚| 欧美精品VIDEOSEX性欧美| 久99久热只有精品国产男同| 精品亚洲综合在线第一区| 曰韩精品无码一区二区三区| 亚洲精品亚洲人成在线观看| 亚洲韩国精品无码一区二区三区| 日韩精品一区二区三区老鸭窝| 国产日韩久久免费影院| 日韩人妻无码精品系列| 亚洲国产欧美日韩精品一区二区三区| 亚洲午夜精品在线| 亚洲制服丝袜精品久久| 亚洲日韩国产精品无码av| 精品国精品国产自在久国产应用 | 国产亚洲精品2021自在线| 日韩美无码五月天| 亚洲国产日韩在线| 日韩熟女精品一区二区三区| 成人免费无码精品国产电影 | 亚洲精品V欧洲精品V日韩精品| 亚洲AV日韩AV永久无码色欲| 精品乱码久久久久久中文字幕| 亚洲国产精品人久久电影|