亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(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,在返回給查詢語(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)看:

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

    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ì)創(chuàng)建一個(gè)重試的IO鏈接。否則,則創(chuàng)建一個(gè)只嘗試一次的IO鏈接,失敗了就不會(huì)重試。這個(gè)選項(xiàng),也是在url中,通過(guò)設(shè)置:autoReconnect=true來(lái)開啟的。

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

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

    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ò)濾。由此證明,最開始的猜想是錯(cuò)的。

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

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)