Deskripsi Latar Belakang: Biasanya, jika Anda perlu memperbarui beberapa data sekaligus, ada dua cara untuk memperbaruinya satu per satu. (1) Mengulangi kode bisnis untuk memperbarui satu per satu. (2) Perbarui semua data sekaligus (lebih tepatnya, ini adalah pernyataan SQL untuk memperbarui semua data, letakkan operasi pembaruan satu per satu di sisi database, dan sisi kode bisnis adalah memperbarui semua data sekaligus). Kedua metode ini memiliki pro dan kontra mereka. Berikut ini akan menganalisis secara singkat pro dan kontra dari dua metode, dan terutama memperkenalkan implementasi metode kedua di Mybatis.
Perbarui satu per satu
Metode ini jelas merupakan kesalahan yang paling sederhana dan paling tidak rentan terhadap kesalahan. Bahkan jika terjadi kesalahan, itu hanya mempengaruhi data kesalahan. Ini dapat dikontrol oleh setiap bagian data. Jika pembaruan gagal atau berhasil, itu dapat diperoleh dari konten apa yang diperbarui ke konten apa. Kode mungkin terlihat seperti ini:
UpdateBatch (Daftar <MyData> data) {for (data myData: data) {coba {mydatadao.update (data); // Perbarui data, perbarui file XML di bawah ini di MyBatis} Operasi MyB (Pengecualian E) {... <dendate> Perbarui set MyData ... di mana ... </update>Masalah terbesar dengan metode ini adalah masalah efisiensi. Ini memperbarui satu per satu, dan terhubung ke database setiap kali, kemudian memperbarui, dan kemudian melepaskan sumber daya koneksi (meskipun efisiensi data yang sering dihubungkan dapat sangat ditingkatkan melalui kumpulan koneksi, yang tidak dapat menahan sejumlah besar data). Kerugian ini akan mencerminkan masalah efisiensi ketika jumlah data besar. Ini juga ketika memenuhi kebutuhan bisnis, implementasi pembaruan batch kedua yang disebutkan di atas biasanya digunakan (tentu saja, metode ini juga memiliki batasan skala data, yang akan disebutkan nanti).
Pembaruan Batch SQL
Pernyataan SQL digunakan untuk memperbarui semua data dalam batch. Mari kita lihat bagaimana biasanya ditulis dalam mybatis (menghapus sintaks mybatis adalah pernyataan SQL asli, jadi saya tidak berbicara tentang bagaimana itu ditulis dalam SQL).
<update id = "updateBatch" parameTerType = "java.util.list"> perbarui mydata_table set status = <foreach collection = "list" item = "item" index = "index" pemisah = "" open = "case id" tutup ""> ketika #{item.id} kemudian #{item.status} </tutup "" "FOREACH = {items.id} kemudian #{item.STATUS} </FOREACH" FOREACH = "FOREACH = {ITEMENT. Separator = "," open = "(" close = ")"> #{item.id, jdbctype = BigInt} </tandingeach> </update>Di mana ketika ... lalu ... adalah sintaks "sakelar" di SQL. Di sini, sintaks <foreach> dari mybatis digunakan untuk menyatukan SQL pembaruan batch. Di atas berarti bahwa bidang status data yang diteruskan dalam daftar ID dalam parameter UpdateBatch diperbarui. Anda juga dapat menggunakan <Rim> untuk mengimplementasikan fungsi yang sama, kodenya adalah sebagai berikut:
<update id="updateBatch" parameterType="java.util.List"> update mydata_table <trim prefix="set" suffixOverrides=","> <trim prefix="status =case" suffix="end,"> <foreach collection="list" item="item" index="index"> when id=#{item.id} then #{item.status} </foreach> </ trim> </ trim> di mana id di <freeach collection = "list" index = "index" item = "item" sparator = "," open = "(" close = ")"> #{item.id, jdbctype = BigInt} </foreach> </update><mendok> deskripsi properti
1.Prefix, Sufiks berarti menambahkan konten di depan atau setelah bagian yang dibungkus dalam tag trim
2. Jika ada awalan pada saat yang sama, Suffixoverrides berarti bahwa konten yang ditimpa akan ditimpa dengan awalan dan sufiks.
3. Jika hanya prefixoverrides, suffixoverrides berarti menghapus konten yang ditentukan oleh xxxoverides di awal atau akhir.
Kode di atas dikonversi menjadi SQL sebagai berikut:
perbarui mydata_table set status = case when id = #{item.id} lalu #{item.status} // ini harus menjadi nilai <foreach> extrand ... akhir di mana id in (...);Tentu saja, ini adalah implementasi pembaruan batch termudah. Terkadang beberapa bidang mungkin perlu diperbarui, jadi Anda perlu
<trim prefix = "status = case" sufix = "end,"> <freeach collection = "list" item = "item" index = "index"> when Id = #{item.id} lalu #{item.status} </treach> </ trim>Salin beberapa kali, ubah konten awalan dan kapan ... lalu ... dan jika Anda perlu mengatur nilai default untuk bidang tertentu, Anda dapat menggunakan yang lain
<trim prefix = "status = case" sufix = "end,"> <freeach collection = "list" item = "item" index = "index"> when Id = #{item.id} lalu #{item.status} </treach> else default_value </ trim>Ada juga situasi yang lebih umum di mana data yang akan diperbarui perlu dinilai, dan hanya data yang memenuhi persyaratan yang dapat diperbarui. Situasi ini bisa dilakukan:
<trim prefix = "status = case" sufix = "end,"> <freeach collection = "list" item = "item" index = "index"> <if test = "item.status! = null dan item.status! = -1"> saat id = #{item.id} lalu #{item.status} </if> </foreach> foreach> trim> trim> {{{{{{{{{{{{{if> </if> </foreach> </foreach> </foreach> </foreach> </foreach> </foreach> Dalam hal ini, hanya status != null && status != -1 data dalam daftar yang akan diperbarui yang dapat diperbarui. Lainnya akan diperbarui dengan nilai default, tanpa menjaga data asli tidak berubah. Bagaimana jika Anda ingin menjaga data asli tidak berubah? Artinya, pembaruan yang memenuhi persyaratan, dan mereka yang tidak memenuhi persyaratan tetap tidak berubah. Cara sederhana untuk melakukannya adalah dengan menambahkan <if> lain, karena tidak ada jika ... lain ... sintaks di mybatis, tetapi efek yang sama dapat dicapai melalui beberapa <if>, sebagai berikut:
<trim prefix = "status = case" sufix = "end,"> <freeach collection = "list" item = "item" index = "index"> <if test = "item.status! = null dan item.status! = -1"> ketika id = #{item.id} lalu #{item.status} </if> <if> {{{{st. id =#{item.id} lalu mydata_table.status // Ini adalah data asli </ifeach> </prim>Pembaruan batch keseluruhan ditulis sebagai berikut:
<update id = "updateBatch" parameTerType = "java.util.list"> perbarui mydata_table <trim prefix = "set" suffixoverrides = ","> <trim prefix = "status = case" suffix = "end,"> <foreach collection = "Daftar" item = "item" index = "index"> <ifeing = "! id =#{item.id} lalu#{item.status} </if> <if test = "item.status == null atau item.status == -1"> saat id =#{item.id} lalu mydata_table.status // data asli </if> </forech> </trim> </trim> trim> Separator = "," open = "(" close = ")"> #{item.id, jdbctype = BigInt} </tandingeach> </update>Metode batch dan basis data inti ini dapat memperbarui semua data dalam koneksi database, menghindari overhead pembentukan dan pemutusan database yang sering, dan sangat meningkatkan efisiensi pembaruan data. Namun, masalahnya adalah jika terjadi kesalahan pembaruan selama proses ini, akan sulit untuk mengetahui data mana yang salah. Jika jaminan transaksi data sendiri digunakan, maka setelah kesalahan terjadi, semua pembaruan akan secara otomatis digulung kembali. Dan metode ini seringkali lebih rentan terhadap kesalahan. Oleh karena itu, solusi yang biasa adalah untuk membuat kompromi, yaitu, untuk memperbarui bagiannya dalam batch (pagination dilakukan, misalnya, ada total 1.000 lembar data, dan 100 lembar data diperbarui pada suatu waktu). Ini dapat berbagi probabilitas kesalahan dan lebih mudah untuk menemukan kesalahan.
Tentu saja, jika jumlah data benar -benar besar, pembaruan batch ini juga akan menyebabkan pembaruan yang tidak efisien (misalnya, jika 100 item diperbarui pada suatu waktu, maka jika 1 miliar data diperbarui, 10 juta kali akan diperlukan untuk pembaruan batch 10 juta kali, dan 10 juta database akan ditetapkan dan diputus, yang tidak dapat diselesaikan). Pada saat ini, Anda mungkin hanya dapat mempertimbangkan solusi lain, seperti memperkenalkan mekanisme caching.
Meringkaskan
Di atas adalah Batch UpdateBatch yang diperkenalkan oleh editor kepada Anda dengan menggunakan UpdateBatch di MyBatis. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!