وصف الخلفية: عادة ، إذا كنت بحاجة إلى تحديث بيانات متعددة في وقت واحد ، فهناك طريقتان لتحديثها واحدًا تلو الآخر. (1) حلقة من خلال رمز العمل لتحديث واحد تلو الآخر. (2) قم بتحديث جميع البيانات في وقت واحد (لتكون أكثر دقة ، فهو عبارة عن عبارة SQL لتحديث جميع البيانات ، ووضع عمليات التحديث واحدة تلو الأخرى على جانب قاعدة البيانات ، ويتمثل جانب رمز العمل في تحديث جميع البيانات في وقت واحد). الطريقتان لها إيجابيات وسلبيات. سيقوم ما يلي بتحليل إيجابيات وسلبيات الطريقتين ، ويقدم بشكل أساسي تنفيذ الطريقة الثانية في MyBatis.
تحديث واحد تلو الآخر
من الواضح أن هذه الطريقة هي أبسط وأقل عرضة للأخطاء. حتى إذا حدث خطأ ، فإنه يؤثر فقط على بيانات الخطأ. يمكن التحكم فيها بواسطة كل جزء من البيانات. إذا فشل التحديث أو نجاحه ، فيمكن الحصول عليه من المحتوى الذي يتم تحديثه إلى المحتوى. قد يبدو الرمز هكذا:
updateBatch (قائمة <DaData> بيانات) {for (myData Data: Datas) {try {mydatadao.update (data) ؛ // تحديث البيانات ، وتحديث ملف XML أدناه في MyBatis} catch (استثناء e) {... // فشل التحديث ، يمكنك القيام ببعض العمليات الأخرى ، مثل الطبقة خطأ ، إلخ. <uptuday> تحديث MyData Set ... حيث ... </update>أكبر مشكلة في هذه الطريقة هي مشكلة الكفاءة. يقوم بتحديث واحد تلو الآخر ، ويتصل بقاعدة البيانات في كل مرة ، ثم يتم تحديثه ، ثم يطلق موارد الاتصال (على الرغم من أن كفاءة البيانات المتصلة بشكل متكرر يمكن تحسينها بشكل كبير من خلال تجمع الاتصال ، والتي لا يمكن أن تتعامل مع كمية البيانات الكبيرة). سوف تعكس هذه الخسارة مشكلة الكفاءة عندما تكون كمية البيانات كبيرة. هذا أيضًا عند تلبية احتياجات العمل ، يتم استخدام تطبيق تحديث الدُفعات الثاني المذكور أعلاه (بالطبع ، تحتوي هذه الطريقة أيضًا على قيود مقياس البيانات ، والتي سيتم ذكرها لاحقًا).
تحديث دفعة SQL
يتم استخدام عبارة SQL لتحديث جميع البيانات على دفعات. دعنا نلقي نظرة على كيفية كتابتها عادة في MyBatis (إزالة بناء جملة MyBatis هو عبارة SQL الأصلية ، لذلك لا أتحدث عن كيفية كتابتها في SQL).
<update id = "updateBatch" parametertype = "java.util.list"> تحديث myData_table SET status = <foreach collection = "list" item = "item" index = "index" explator = "" open = "case id =" for "ext =" for "ext =" for "expant =" expant = "for" expant = "for". فاصل = "،" open = "(" elut = ")"> #{item.id ، jdbctype = bigint} </foreach> </uptuday>حيث عندما ... ثم ... هو بناء جملة "التبديل" في SQL. هنا ، يتم استخدام بناء جملة <Foreach> لـ MyBatis لتجميع تحديث الدُفعات SQL معًا. ما سبق يعني أن حقل الحالة للبيانات التي تم تمريرها في قائمة المعرف في معلمة updatebatch تم تحديث الدفعة. يمكنك أيضًا استخدام <trim> لتنفيذ نفس الوظيفة ، كما يلي الرمز:
<update id = "updatebatch" parametertype = "java.util.list"> تحديث myData_table <trim prefix = "set" suffixoverrides = "،"> <trim prefix = "status = case" faceix = "end ،" </trim> </trim> حيث معرف في <foreach collection = "list" index = "index" item = "item" explator = "،" open = "(" elut = ")"> #{item.id ، jdbctype = bigint} </foreach> </uptuday><srive> وصف الخاصية
1.Prefix ، يعني اللاحقة إضافة محتوى في المقدمة أو بعد الجزء ملفوف في علامة القطع
2. إذا كان هناك بادئة في نفس الوقت ، فإن Saffixoverrides يعني أن المحتوى الموجود في التجاوزات سيتم الكتابة فوق البادئة واللاحقة.
3. إذا كانت البادئة فقط ، فإن Faffixoverrides تعني حذف المحتوى المحدد بواسطة XXXoVerides في البداية أو النهاية.
يتم تحويل الرمز أعلاه إلى SQL على النحو التالي:
قم بتحديث MyData_table SET STATUS = CASE عندما يكون المعرف = #{item.id} ثم #{item.status} // يجب أن يكون هذا هو <Foreach> توسيع القيمة ... نهاية حيث المعرف في (...) ؛بالطبع ، هذا هو أسهل تطبيق تحديث الدفعة. في بعض الأحيان قد تحتاج إلى تحديث حقول متعددة ، لذلك تحتاج إلى ذلك
<trim prepix = "status = case" fuckix = "end ،"> <foreach collection = "list" item = "item" index = "index"> in id = #{item.id} ثم #{item.status} </foreach> </rim>انسخ عدة مرات ، وتغيير محتويات البادئة ومتى ... ثم ... وإذا كنت بحاجة إلى تعيين القيمة الافتراضية لحقل معين ، يمكنك استخدام آخر
<trim prepix = "status = case" fuckix = "end ،"> <foreach collection = "list" item = "item" index = "index"> in id = #{item.id} ثم #{item.status} </foreach> else default_value </rive>هناك أيضًا موقف أكثر شيوعًا حيث يجب الحكم على البيانات التي سيتم تحديثها ، ولا يمكن تحديث البيانات التي تلبي الشروط إلا التي يمكن تحديث الشروط. يمكن القيام بهذا الموقف:
<trim prepix = "status = case" fuckix = "end ،"> <foreach collection = "list" item = "item" index = "index"> <if test = "item.status! = null and item.status! = -1"> in id = #{item.id} ثم #{item.Status} </if> </trim> في هذه الحالة ، يمكن تحديث status != null && status != -1 بيانات في القائمة المراد تحديثها. سيتم تحديث الآخرين بالقيم الافتراضية ، دون الحفاظ على البيانات الأصلية دون تغيير. ماذا لو كنت تريد الحفاظ على البيانات الأصلية دون تغيير؟ أي أن التحديثات التي تلبي الشروط ، وتلك التي لا تفي بالظروف لا تزال دون تغيير. هناك طريقة بسيطة للقيام بذلك وهي إضافة أخرى <f> ، لأنه لا يوجد إذا ... أخرى ... بناء جملة في mybatis ، ولكن يمكن تحقيق نفس التأثير من خلال <f <ffires> ، على النحو التالي:
<trim prepix = "status = case" fuckix = "end ،"> <foreach collection = "list" item = "item" index = "index"> <if test = "item.status! = null and item.status! = -1"> in id = #{item.id} ثم #{item.Status} </if> if test = " id =#{item.id} ثم mydata_table.status // هذه هي البيانات الأصلية </if> </foreach> </rive>يتم كتابة التحديث الإجمالي للدفعة على النحو التالي:
<update id = "updateBatch" parametertype = "java.util.list"> تحديث myData_table <trim prefix = "set" suffixoverrides = "،"> <trim prefix = "status = case" factix = "end ،" ID =#{item.id} ثم#{item.status} </fort> <if test = "item.status == null أو item.status == -1"> عندما يكون المعرف =#{item.id} ثم myData_table.status // data data </foreach> </trim> in trim> in "expant =" index = فاصل = "،" open = "(" elut = ")"> #{item.id ، jdbctype = bigint} </foreach> </uptuday>يمكن أن تقوم طريقة قاعدة البيانات الأساسية والأساسية بتحديث جميع البيانات في اتصال قاعدة البيانات ، وتجنب النفقات العامة لإنشاء قاعدة البيانات المتكررة وانفصالها ، وتحسين كفاءة تحديث البيانات بشكل كبير. ومع ذلك ، فإن المشكلة هي أنه في حالة حدوث خطأ في التحديث أثناء هذه العملية ، سيكون من الصعب معرفة البيانات الخاطئة. إذا تم استخدام ضمان المعاملات الخاص بالبيانات ، فبمجرد حدوث خطأ ، سيتم ترحيل جميع التحديثات تلقائيًا. وغالبًا ما تكون هذه الطريقة أكثر عرضة للأخطاء. لذلك ، فإن الحل المعتاد هو تقديم تنازلات ، أي تحديث جزء منه على دفعات (يتم ترقيم الصفحات ، على سبيل المثال ، هناك ما مجموعه 1000 قطعة من البيانات ، ويتم تحديث 100 قطعة من البيانات في وقت واحد). يمكن أن يشارك هذا احتمال وجود أخطاء ومن الأسهل تحديد موقع الخطأ.
بالطبع ، إذا كان مقدار البيانات كبيرًا حقًا ، فسيؤدي هذا التحديث الدُفعات أيضًا إلى تحديثات غير فعالة (على سبيل المثال ، إذا تم تحديث 100 عنصر في وقت واحد ، في حين تم تحديث مليار بيانات ، فستكون هناك حاجة إلى 10 ملايين مرة لتحديث 10 ملايين مرة ، وسيتم وضع 10 ملايين قاعدة بيانات وفصلها ، وهو أمر لا يطاق). في هذا الوقت ، قد تكون قادرًا فقط على التفكير في حلول أخرى ، مثل إدخال آلية التخزين المؤقت.
لخص
ما سبق هو Batch UpdateBatch الذي قدمه لك المحرر باستخدام UpdateBatch في MyBatis. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!