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

        mysql中update語句返回什么

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

        mysql中update語句返回什么

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

        mysql中update語句返回什么

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

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

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

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

        若為:

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

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

        綜上:

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

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

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

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

        擴展知識:

        猜想

        如果通過cmd操作mysql的update語句,屏幕上顯示其實是這樣的:

        mysql中update語句返回什么

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

        證實

        借用一個圖來說明創(chuàng)建connection的整個過程:

        mysql中update語句返回什么

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

        當我研究了一段時間之后,我發(fā)現(xiàn),這兩種想法都錯了。具體來看:

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

        mysql中update語句返回什么

        1,建立Connection

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

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

        往下追蹤:

        mysql中update語句返回什么

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

        mysql中update語句返回什么

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

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

        mysql中update語句返回什么

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

        mysql中update語句返回什么

        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語句返回什么

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

        mysql中update語句返回什么

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

        mysql中update語句返回什么

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

        設(shè)置完成之后:

        mysql中update語句返回什么

        2,創(chuàng)建MysqlIO

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

        mysql中update語句返回什么

        mysql中update語句返回什么

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

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

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

        mysql中update語句返回什么

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

        mysql中update語句返回什么

        這個CLIENT_FOUND_ROWS的值為:

        mysql中update語句返回什么

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

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

        mysql中update語句返回什么

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

        mysql中update語句返回什么

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

        4,報文分析:

        useAffectedRows=true時:

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

        mysql中update語句返回什么

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

        mysql中update語句返回什么

        useAffectedRows=false時:

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

        mysql中update語句返回什么

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

        mysql中update語句返回什么

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

        推薦學習:mysql視頻教程

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 亚洲国产精品视频| 国产精品免费无遮挡无码永久视频| 亚洲日韩一页精品发布| 亚洲第一精品在线视频| 久久丫精品国产亚洲av| 精品视频一区二区三区四区五区| 国产欧美国产精品第一区| 久久免费的精品国产V∧| 欧美激情精品久久久久久久| 国产精品99久久不卡| 国产大片91精品免费观看不卡| 久久久无码人妻精品无码| 亚洲国模精品一区| 久久99精品九九九久久婷婷| 99re66在线观看精品免费| 国产精品手机在线| 国产精品v片在线观看不卡| 精品亚洲A∨无码一区二区三区| 亚洲精品国产日韩无码AV永久免费网 | 华人在线精品免费观看| 精品人妻码一区二区三区| 亚洲av永久无码精品表情包| 无码国模国产在线无码精品国产自在久国产 | 久久91精品国产91久久小草| 国产91精品在线观看| 2022精品天堂在线视频| 国产欧美精品一区二区三区 | 久久这里只有精品视频99| 精品久久久久中文字幕一区| 精品久久久久久99人妻| 精品一区二区三区高清免费观看 | 精品一区二区三区在线视频| 精品久久久久久中文字幕| 国产精品欧美一区二区三区不卡| 99精品一区二区三区无码吞精 | 亚洲国产精品自在在线观看| 久久99精品久久久久久| 日韩欧美精品不卡| 成人精品一区二区三区| 国产在AJ精品| 亚洲国产精品日韩|