プロジェクトで使用されているORMフレームワークは、springdatajpaで作成されています。一部のバッチデータ操作では、効率が低すぎるため、mybatisを使用してSQLを記述し、最適化します。
一般に、最初にクエリを実行し、存在する場合は変更し、存在しない場合は追加する必要があります。この場合、単一の操作で問題ありません。大量のデータの場合は、毎回確認して変更する必要があります(springdatajpaを使用する場合は、追加する前に確認する必要があります)。もう一度)、それはあまりにも多くのリソースを消費します。
mysqlの解決策はありますか?もちろんあります。いくつかの情報を確認しました。1つはreplace intoを使用する方法で、もう1つは重複キーの更新を解決する方法です。最初に、これら2つの方法の違いを説明します。
最初にテーブルを作成します(設定したユーザー名列は一意であり、ユーザー名を繰り返すことはできません)
CREATE TABLE user_table( id INT PRIMARY KEY AUTO_INCREMENT、 username VARCHAR( 10 )UNIQUE KEY、 address VARCHAR( 10 ) )
データを追加する
INSERT INTO user_table(id、username、address)VALUE(NULL、 'Hu Junjie'、 'Beijing')
目的:データが最初に存在するかどうかを照会してから変更する(1つの文で実装)
REPLACE INTO user_table(id、username、address)VALUE(NULL、 'Hu Junjie'、 'Heilongjiang')
sqlの実行後、2行が影響を受けることが示されます。
データベース内のデータを監視した後、名前は変更されておらず、アドレスは変更されており、IDも変更されています
replace intoは最初にオリジナルを削除してから追加することであることを説明します。
これは明らかに悪いことですが、このテーブルのIDがテーブルの外部キーであるというシナリオがあるため、これがエラーの原因になるため、解決策としてメソッド2を導入します。
方法2:
現在、胡淳傑は北京に戻る準備ができています。sqlステートメントは次のとおりです
INSERT INTO user_table(id、username、address)VALUE(NULL、 'Hu Junjie'、 'Beijing')ON DUPLICATE KEY UPDATE address = 'Beijing'
INSERT INTO user_table(id、username、address)VALUE(NULL、 '胡俊杰'、 '北京 ')ON DUPLICATE KEY UPDATE address = VALUES(address)//両方のメソッドを使用でき、以下は渡された値を動的にバインドできます
今回はまだ2行が変更されています。データベースのデータを見てみましょう
IDは変更されていません。アドレスのみが変更されています。これが最も実用的な方法です。
次に、mybatis着信リストのバッチ変更を行う方法を示します
@Insert( "<script> insert into user_table(username、age、address)" + "values <foreach collection = 'users' item = 'item' index = 'index' separator = '、'>" + "(#{ item.username}、#{item.age}、#{item.address})</ foreach> "+ " ON DUPLICATE KEY UPDATE username = values(username)、age = values(age)、address = values(commaddr) </ script> ") void insert(@Param(" users ")List <User> users);
わからない場合は、メッセージを残してください。お役に立てれば幸いです。!!