Hintergrundbeschreibung: Wenn Sie mehrere Daten gleichzeitig aktualisieren müssen, gibt es normalerweise zwei Möglichkeiten, sie einzeln zu aktualisieren. (1) Durchschleifen Sie die Geschäftsordnung, um einzeln zu aktualisieren. (2) Alle Daten gleichzeitig aktualisieren (genauer zu sein, es handelt sich um eine SQL -Anweisung, um alle Daten zu aktualisieren, die Aktualisierungsvorgänge einzeln auf der Datenbankseite zu setzen, und die Geschäftsordnung besteht darin, alle Daten gleichzeitig zu aktualisieren). Die beiden Methoden haben ihre Vor- und Nachteile. Im Folgenden wird kurz die Vor- und Nachteile der beiden Methoden analysiert und hauptsächlich die Implementierung der zweiten Methode in MyBatis einführen.
Aktualisieren Sie eins nach dem anderen
Diese Methode ist offensichtlich die einfachste und am wenigsten anfällig für Fehler. Auch wenn ein Fehler auftritt, wirkt sich nur die Fehlerdaten aus. Es kann durch jedes Datenstück gesteuert werden. Wenn das Update fehlschlägt oder erfolgreich ist, kann es aus welchem Inhalt auf welchen Inhalt aktualisiert werden. Der Code könnte so aussehen:
updateBatch(List<MyData> datas){ for(MyData data: datas){ try{ myDataDao.update(data);//Update a data, update of the xml file below in mybatis } catch(Exception e){ ...//If the update fails, you can do some other operations, such as printing an error log, etc.} }}//Implementation of update operation in mybatis <UPDATE> UPDATE MYDATA SET ... WHERE ... </UPDATE>Das größte Problem bei dieser Methode ist das Effizienzproblem. Es aktualisiert nacheinander einzeln und stellt jedes Mal eine Verbindung zur Datenbank her, aktualisiert dann die Verbindungsressourcen (obwohl die Effizienz häufig angeschlossener Daten durch den Verbindungspool erheblich verbessert werden kann, der nicht der großen Datenmenge standhalten kann). Dieser Verlust spiegelt das Effizienzproblem wider, wenn die Datenmenge groß ist. Dies ist auch bei der Erfüllung der geschäftlichen Bedürfnisse die oben erwähnte zweite Batch -Update -Implementierung verwendet (natürlich hat diese Methode auch Datenskala -Einschränkungen, die später erwähnt werden).
SQL -Batch -Update
Eine SQL -Anweisung wird verwendet, um alle Daten in Stapeln zu aktualisieren. Schauen wir uns an, wie es normalerweise in MyBatis geschrieben ist (das Entfernen der MyBatis -Syntax ist die native SQL -Anweisung, sodass ich nicht darüber spreche, wie sie in SQL geschrieben ist).
<update id = "updateBatch" parameterType = "java.util.list"> aktualisieren mydata_table set status = <foreach collection separator = "," open = "(" close = ")"> #{item.id, jdbctype = bigint} </foreach> </update>Wo wenn ... dann ... ist die "Switch" -Syntax in SQL. Hier wird die <Foach> -Syntax von MyBatis verwendet, um das Batch -Update SQL zusammenzusetzen. Das oben genannte bedeutet, dass das Statusfeld der in der Liste der ID im Parameter UpdateBatch übergebenen Daten die Batch aktualisiert wird. Sie können auch <trim> verwenden, um dieselbe Funktion zu implementieren. Der Code lautet wie folgt:
<update id = "updateBatch" parameterType = "java.util.list"> Aktualisieren Sie myData_table <trim prefix = "setze" SuffIXoverrides = ","> <trim prefix = "status = case" suffix = "end,"> <foreach collection </trim> </trim> wobei ID in <foreach collection = "list" index = "index" item = "item" separator = "," open = "(" close = ")"> #{item.id, jdbctype = bigint} </foreach> </update><Strim> Eigenschaftsbeschreibung
1.Prefix, Suffix bedeutet, Inhalte vor oder nach dem in das Trimm -Tag eingewickelten Teil hinzuzufügen
2. Wenn gleichzeitig Präfixenriden vorhanden sind, bedeutet SuffiXoverrides, dass der Inhalt in Überschreibungen mit Präfix und Suffix überschrieben wird.
3. Wenn Sie nur Präfixe -Rides -Suffixe -Overrides vornehmen, können Sie den von XXXOverides angegebenen Inhalt zu Beginn oder am Ende löschen.
Der obige Code wird wie folgt in SQL konvertiert:
Aktualisieren Sie mydata_table set status = case wenn id = #{item.id} dann #{item.status} // Dies sollte der <Feach> -Wuf Wertes sein ... Ende id in (...);Dies ist natürlich die einfachste Implementierung von Batch -Update. Manchmal müssen möglicherweise mehrere Felder aktualisiert werden, sodass Sie also müssen
<trim prefix = "status = case" suffix = "end"> <foreach collection
Kopieren Sie mehrmals, ändern Sie den Inhalt des Präfixs und wenn ... dann ... und wenn Sie den Standardwert für ein bestimmtes Feld festlegen müssen, können Sie sonst verwenden
<trim prefix = "status = case" suffix = "end"> <foreach collection = "list" item = "item" index = "inde
Es gibt auch eine häufigere Situation, in der die zu aktualisierten Daten beurteilt werden müssen, und nur Daten, die den Bedingungen erfüllen, können aktualisiert werden. Diese Situation kann geschehen:
<trim prefix = "status = case" suffix = "end"> <foreach collection
In diesem Fall kann nur status != null && status != -1 Daten in der zu aktualisierten Liste aktualisiert werden. Andere werden mit Standardwerten aktualisiert, ohne die Originaldaten unverändert zu halten. Was ist, wenn Sie die ursprünglichen Daten unverändert halten möchten? Das heißt, Aktualisierungen, die den Bedingungen erfüllen, und diejenigen, die den Bedingungen nicht erfüllen, bleiben unverändert. Eine einfache Möglichkeit, dies zu tun, besteht darin, ein weiteres <wenn> hinzuzufügen, da es nein, wenn ... sonst ... Syntax in mybatis, aber der gleiche Effekt kann durch mehrere <wenn> erzielt werden, wie folgt:
<trim prefix = "status = case" suffix = "end"> <foreach collection id =#{item.id} dann mydata_table.status // Dies sind die Originaldaten </if> </foreach> </trim>Das Gesamt -Batch -Update wird wie folgt geschrieben:
<update id = "updateBatch" parameterType = "java.util.list"> Aktualisieren Sie myData_table <trim prefix = "Setzen Sie" SuffIXoverrides = ","> <trim prefix = "status = case" suffix = "enden,"> <foreach collection = "liste id =#{item.id} dann#{item.status} </if> <if test = "item.status == null oder item.status == -1"> wenn id =#{item.id} dann mydata_table.status // Originaldaten </if> </telach> </trim> item> item> item> item> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trim> </trin. " separator = "," open = "(" close = ")"> #{item.id, jdbctype = bigint} </foreach> </update>Diese Stapel- und Kerndatenbankmethode kann alle Daten in einer Datenbankverbindung aktualisieren, um den Overhead der häufigen Datenbankorientierung und des Trennens zu vermeiden und die Effizienz der Datenaktualisierung erheblich zu verbessern. Das Problem ist jedoch, dass es schwierig sein wird, zu wissen, welche Daten falsch sind, wenn ein Aktualisierungsfehler auftritt. Wenn die eigene Transaktionsgarantie der Daten verwendet wird, werden alle Aktualisierungen automatisch zurückgeführt. Und diese Methode ist oft anfälliger für Fehler. Daher besteht die übliche Lösung darin, Kompromisse zu erstellen, dh einen Teil davon in Stapeln zu aktualisieren (die Pagination wird beispielsweise insgesamt 1.000 Datenstücke erfolgen und 100 Daten werden jeweils aktualisiert). Dies kann die Wahrscheinlichkeit von Fehlern teilen und es ist einfacher, den Fehler zu lokalisieren.
Wenn die Datenmenge wirklich groß ist, führt dieses Stapel -Update natürlich auch zu ineffizienten Updates (z. B. wenn 100 Elemente gleichzeitig aktualisiert werden, wenn 1 Milliarde Daten aktualisiert werden, werden 10 Millionen Mal 10 Millionen Mal angegeben, und 10 Millionen Datenbanken werden festgelegt und getrennt, was unerträglich ist). Zu diesem Zeitpunkt können Sie möglicherweise nur andere Lösungen berücksichtigen, z. B. die Einführung eines Caching -Mechanismus.
Zusammenfassen
Das obige ist das Batch UpdateBatch, das der Editor Ihnen mithilfe von UpdateBatch in MyBatis vorgestellt hat. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!