背景の説明:通常、一度に複数のデータを更新する必要がある場合は、1つずつ更新する2つの方法があります。 (1)ビジネスコードを1つずつ更新するためにループします。 (2)すべてのデータを一度に更新します(より正確には、すべてのデータを更新し、データベース側に更新操作を1つずつ配置するのはSQLステートメントであり、ビジネスコード側はすべてのデータを一度に更新することです)。 2つの方法には長所と短所があります。以下は、2つの方法の長所と短所を簡単に分析し、主にMyBatisの2番目の方法の実装を導入します。
1つずつ更新します
この方法は、明らかにエラーが発生しやすく、最も単純で最も少ない傾向があります。エラーが発生したとしても、エラーデータのみに影響します。各データによって制御できます。更新が失敗または成功した場合、どのコンテンツが更新されるかから取得できます。コードは次のようになるかもしれません:
updatebatch(list <mydata> datas){for(mydata data:datas){try {mydatadao.update(data); //データの更新、以下のxmlファイルの更新、mybatis} catch} {... //更新が失敗した場合、操作を印刷するなど、エラーログなどの操作など、他の操作を行うことができます。 <update>更新mydata set ... where ... </update>この方法の最大の問題は、効率の問題です。 1つずつ更新し、毎回データベースに接続してから更新してから接続リソースをリリースします(ただし、頻繁に接続されたデータの効率は、大量のデータに耐えられない接続プールを通じて大幅に改善できます)。この損失は、データの量が多い場合の効率の問題を反映します。これは、ビジネスニーズを満たす場合でもあります。上記の2番目のバッチアップデートの実装が通常使用されます(もちろん、この方法にはデータスケールの制限もあり、後で言及します)。
SQLバッチアップデート
SQLステートメントは、バッチ内のすべてのデータを更新するために使用されます。それが通常MyBatisでどのように書かれているかを見てみましょう(MyBatis構文を削除することはネイティブSQLステートメントであるため、SQLでどのように書かれているかについては話しません)。
<update id = "updateBatch" parametertype = "java.util.list">更新mydata_table set status = <foreach collection = "iteal" item = "index" separator = "" open = "case id" close = "end"> when#{item.id} then#{item.status} item = "item" separator = "、" open = "(" close = ")">#{item.id、jdbctype = bigint} </foreach> </update>どこで...それから... SQLの「スイッチ」構文はあります。ここでは、MyBatisの<Foreach>構文を使用して、バッチアップデートSQLをつなぎ合わせます。上記は、UpdateBatchパラメーターのIDのリストに渡されたデータのステータスフィールドがバッチ更新されることを意味します。 <trim>を使用して同じ関数を実装することもできます。コードは次のとおりです。
<update id = "updateBatch" parametertype = "java.util.list">更新mydata_table <trim prefix = "set" suffixoverrides = "、"> <トリムプレフィックス= "ステータス=" end "end" </trim> </trim> where id in <foreach collection = "list" index = "index" item = "item" separator = "、" open = "(" close = ")"> {item.id、jdbctype = bigint} </foreach> </update><trim>プロパティの説明
1.Prefix、接尾辞とは、トリムタグにラップされた部品の前または後にコンテンツを追加することを意味します
2.プレフィックスオーバーリデスが同時にある場合、suffixOverridesとは、オーバーライドのコンテンツが接頭辞と接尾辞で上書きされることを意味します。
3.プレフィックスオーバーリデスのみの場合、suffixOverridesとは、最初または最後にxxxoveridesで指定されたコンテンツを削除することを意味します。
上記のコードは、次のようにSQLに変換されます。
mydata_table set status = case id =#{item.id}の場合、#{item.status} //これは<foreach>展開値である必要があります...もちろん、これは最も簡単なバッチアップデートの実装です。複数のフィールドを更新する必要がある場合があるため、
<トリムプレフィックス= "status = case" suffix = "end"> <foreach collection = "quite" item "item" index = "index"> when id =#{item.id} then#{item.status} </foreach> </trim>複数回コピーし、プレフィックスの内容を変更します。
<トリムプレフィックス= "status = case" suffix = "end"> <foreach collection = "quite" item "item" index = "index"> when id =#{item.id} then#{item.status} </foreach> else default_value </trim>また、更新されるデータを審査する必要があるより一般的な状況もあり、条件を満たすデータのみを更新できます。この状況は、次のようにすることができます。
<トリムプレフィックス= "status = case" suffix = "end"> <foreach collection = "quite" item = "index =" index "> <if test =" item.status!= null and item.status!= -1 "> when id = {item.id} then#{item.status} <この場合、更新するリスト内のstatus != null && status != -1データのみを更新できます。その他は、元のデータを変更せずにデフォルト値で更新されます。元のデータを変更せずに保管したい場合はどうなりますか?つまり、条件を満たす更新、および条件を満たさない更新は変わらないままです。それを行う簡単な方法は、別の<if>を追加することです。なぜなら、mybatisには...他の...構文はありませんが、次のように複数の<if>で同じ効果を達成できます。
<トリムプレフィックス= "status = case" fonfix = "end"、 "> <foreach collection =" quite "item =" item "index =" index "> <if test =" item.status!= null and item.status!= -1 "> when id = {item.id} then#{item.status} < id =#{item.id} then mydata_table.status //これは元のデータです</if> </foreach> </trim>全体的なバッチアップデートは次のように記述されています。
<update id = "updatebatch" parametertype = "java.util.list">更新mydata_table <trim prefix = "set" suffixoverrides = "、"> <トリムプレフィックス= "ステータス= case" fonfix = "end" id =#{item.id} then#{item.status} </if> <if> <if test = "item.status == nullまたはitem.status.status == -1"> id =#{item.id} then myData_table.Status //元のデータ</if> </foreach> </trim> </triam separator = "、" open = "(" close = ")">#{item.id、jdbctype = bigint} </foreach> </update>このバッチおよびコアデータベースメソッドは、データベース接続内のすべてのデータを更新し、頻繁なデータベースの確立と切断のオーバーヘッドを回避し、データの更新効率を大幅に改善できます。ただし、問題は、このプロセス中に更新エラーが発生した場合、どのデータが間違っているかを知ることが困難であることです。データ独自のトランザクション保証が使用される場合、エラーが発生したら、すべての更新が自動的にロールバックされます。そして、この方法は、多くの場合、エラーを発生しやすくなります。したがって、通常の解決策は、妥協、つまりバッチでその一部を更新することです(たとえば、合計1,000個のデータがあり、100個のデータが一度に更新されます)。これにより、エラーの確率が共有され、エラーを見つける方が簡単です。
もちろん、データの量が非常に大きい場合、このバッチアップデートは非効率的な更新にもつながります(たとえば、100個のアイテムが一度に更新される場合、10億データが更新された場合、1,000万回をバッチ1,000万回バッチする必要があり、1,000万回のデータベースが確立され、切断されます。現時点では、キャッシュメカニズムの導入など、他のソリューションのみを検討できる場合があります。
要約します
上記は、MyBatisでUpdateBatchを使用して、編集者によって紹介されたバッチアップデートバッチです。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!