mysql の update ステートメントの戻り結果: 1. データベース URL に "useAffectedRows=true" パラメーターがない場合は、一致する行の数が返されます; 2. "useAffectedRows=" パラメーターがある場合は、一致する行の数が返されます。データベース URL の true" パラメータは、影響を受ける行の数を返します。
このチュートリアルの動作環境: Windows10 システム、mysql8.0.22 バージョン、Dell G3 コンピューター。
update ステートメントの結果が返す一致する行の数は何ですか?それとも行数に影響するのでしょうか?
まず結果について話しましょう。データベースの URL が
jdbc:mysql://gitlab.fzghjx.com:3306/cron
の場合、返される結果は number の一致する行 (一致した行数) です。 )。
次の場合:
jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true
、影響を受けた (変更された) 行の数が返されます。
要約:
URL に useAffectedRows=true パラメーターがない場合、一致する行の数が返されます。存在する場合、影響を受ける行の数が返されます。
戻り値を影響を受ける (変更された) レコードの数にするにはどうすればよいですか?
mysql データ接続 URL パラメーターに useAffectedRows=true を追加するだけです
jdbc.url=jdbc:mysql://localhost:3306/ssm?useAffectedRows=true
知識を広げる:
推測
#mysql の update 文を cmd で操作すると、実際の画面表示は次のようになります。この問題を考えると、まず次のようなことが考えられます。レスポンスに対する回答は2つ 1. mysqlサーバーの戻り結果で判定 trueに設定した場合はRows matchedの値を返し、falseに設定した場合はChangedの値を返します。 2. クエリ ステートメントに戻るときに、この値を選択します。
#確認図を使用して、接続を作成するプロセス全体を説明しましょう。
(写真は https://blog.csdn.net/c929833623lvcha/article/details/44517245 から引用)
しばらく勉強した後、次のことがわかりました。二つの考え すべて間違っています。具体的には:簡単な jdbc クエリを書きました:
1, 接続を確立します
が接続属性として設定されます。
Connection connection = DriverManager.getConnection("jdbc:mysql://gitlab.fzghjx.com:3306/cron?useAffectedRows=true", "root", "root");
に従ってください:
続き: 接続メソッドは java.sql.Driver#connect とその実装です。 com.mysql.jdbc.NonRegisteringDriver#connect
##useAffectedRows=true は com.mysql.jdbc.NonRegisteringDriver#parseURL メソッドで読み取られ、プロパティ props に設定されます。
さらに下: com.mysql.jdbc.ConnectionImpl#getInstance で connectiong のインスタンスを取得します。#これはリフレクションです。引数は 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); }
(ちなみに、ここではトランザクションの分離レベルは 2 に設定されており、読み取りはコミットされています)
In このコンストラクターでは、useAffectedRows の値が接続に初期化されます。
設定するプロパティは 206 個あり、useAffectedRows は 190 位にランクされます (別の mysql-connect -javaバージョン、場所が異なります)。
設定が完了したら: ##2、MysqlIO を作成しますプロパティを設定したら、MysqlIO を作成します:
「高可用性」オプションがあり、その場合、再試行 IO リンクが作成されます。それ以外の場合は、一度だけ試行され、失敗しても再試行されない IO リンクを作成します。このオプションは、URL で autoReconnect=true を設定することによっても有効になります。
接続 IO プロセスは、実際には MysqlIO を作成し、ハンドシェイクを開始します:
重要なポイント すでに: doHandshake メソッドで、useAffectedRows オプションが設定されています: (com.mysql.jdbc.MysqlIO#doHandshake)
##この CLIENT_FOUND_ROWS の値は: つまり、下位ビットの最後から 2 番目の桁の値はまたは 演算を実行します。 useAffectsRows の場合、 または 操作は実行されません。
設定後、mysqlOutput ソケット経由で mysql サーバーに送信します。 mysqlOutput ソース: MysqlIO のビルド時に作成されます。 わかりました。これは簡単なプロセスです。次に、TCP メッセージを見てみましょう: 4、メッセージ分析:useAffectedRows=true:
Send request To mysql サーバー:
# mysql サーバーからの応答:
# #useAffectedRows の場合=false:
##mysql サーバーにリクエストを送信:
#Mysql サーバーの応答:
上記のメッセージからわかるように、useAffectedRows が true と false の場合、msyql サーバーの戻り値は異なります。最後に、jdbc によって取得される戻り結果は、メッセージ内の影響を受ける行の値です。 msyql の結果から直接取得した jdbc は、結果に対して解析とフィルタリングを実行するだけです。これは、最初の推測が間違っていたことを証明します。
推奨学習: mysql ビデオ チュートリアル
以上がmysql の update ステートメントは何を返しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。