Ein Listen -Sammlungsobjekt ist im Programm eingekapselt, und dann müssen die Entitäten in der Sammlung in die Datenbank eingefügt werden. Da das Projekt die Spring+MyBatis -Konfiguration verwendet, ist es geplant, die MyBatis -Batch -Einfügung zu verwenden. Da es vorher noch keine Stapelinsertion gegeben hat, habe ich es schließlich implementiert, nachdem ich nach einigen Informationen im Internet gesucht und den detaillierten Prozess veröffentlicht hatte.
Die Entity Class TrainRecord -Struktur lautet wie folgt:
Public Class TrainRecord implementiert serialisierbar {private statische endgültige long serialversionuid = -1206960462117924923L; private lange Ausweis; private lange Aktivität; privat langem Empid; Private int Flag; private String addtime; // Setter und Getter} Der entsprechende Mapper.xml ist wie folgt definiert:
<resultMap type = "trainrecord" id = "trainrecorcornesultmap"> <id column = "id" property = "id" jdbctype = "bigint" /> <resultal column = "add_time" addtime "addtime" jdbctype = "varchar" /> <resulting columne column = "acity_id" property = "acityID" jdbctype = "bigint" /> <resultal column = "acity_id" property = "acityID" jdbctype = "bigint" /> <resultal column = "flag" property = "status" jdbctype = "varchar" /> < /resultmap>
Die Definition der Batch -Einfügungsmethode in mapper.xml lautet wie folgt:
<insert id="addTrainRecordBatch" useGeneratedKeys="true" parameterType="java.util.List"> <selectKey resultType="long" keyProperty="id" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> insert into t_train_record (add_time,emp_id,activity_id,flag) values <foreach collection="list" item = "item" index = "index" separator = ","> (#{item.addtime}, {item.empid},#{item.activityId},#{item.flag}) </foreach> </Insert>Die Erläuterung des Foreach -Tags wird wie folgt auf Online -Informationen verwiesen:
Foreach wird hauptsächlich beim Aufbau unter Bedingungen eingesetzt. Sie kann über eine Sammlung in SQL -Aussagen iterieren. Die Attribute des Foreach -Elements enthalten hauptsächlich Element, Index, Sammlung, Öffnen, Trennzeichen und Schließen. Element repräsentiert den Alias, wenn jedes Element in der Sammlung iteriert wird. Index gibt einen Namen an, der die Position darstellt, zu der jede Iteration während des Iterationsprozesses erreicht wird. Open repräsentiert, was mit der Aussage beginnt, Separator stellt dar, welche Symbole zwischen jeder Iteration als Trennzeichen verwendet werden, und Close repräsentiert, was mit endet. Das kritischste und fehlerhafteste Sache bei der Verwendung von foreach ist das Sammelattribut. Dieses Attribut muss angegeben werden, aber in verschiedenen Fällen ist der Wert des Attributs unterschiedlich. Es gibt drei Hauptsituationen:
1. Wenn der in einem einzelnen Parameter übergebene Parameter und der Parametertyp eine Liste ist, ist der Sammelattributwert die Liste
2. Wenn der in einem einzelnen Parameter übergebene Parameter und der Parametertyp ein Array ist, ist der Eigenschaftswert der Sammlung Array
3. Wenn mehrere Parameter übergeben werden, müssen wir sie in eine Karte einkapseln. Natürlich kann auch ein einzelner Parameter in eine Karte eingekapselt werden.
Ich werde hier keine spezifischen Beispiele über Foreach auflisten. Ich kann ein Beispiel für jede Situation geben, wenn ich in Zukunft die Chance habe.
Mysqlbasedao:
öffentliche Klasse MySQLBasedao erweitert SQLSessionDaOSupport { /*** Einfügen: Einfügen Betrieb. <br/> * * @Author Chenzhou * @param Method -Methode Name des Einfügenoperiums * @param Entity Query Parameter oder Entity -Klasse * @return return die Anzahl der betroffenen Zeilen * @Since Jdk 1.6 */ public int Intieren (String -Methode, Objektentität zurückgeben). } // Andere Methoden werden weggelassen} Der TrainingRecorddao, der der Trainingcord -Entitätsklasse entspricht, ist wie folgt definiert:
Die öffentliche Klasse TrainRecorddao erweitert MySQLBasedao { /*** AddtrainRecordbatch: Batch Insert Training Records. <br/> * * @Author Chenzhou * @param traincordlist Training Record List Collection * @return Anzahl der betroffenen Zeilen * @Since Jdk 1.6 */ public int addtrainRecordbatch (list <traincord> trainrecordlist) {INSERT ("addtrainRecordbatch", TrainReCordList); } // Die verbleibenden Methoden weglassen} Rufen Sie dann die AddTrainRecordbatch -Methode direkt in TrainingCorddao an und Sie können sie in Chargen einfügen.
Es ist besonders angemerkt, dass ich beim Versuch auf einen sprachlosen Fehler gestoßen bin, und ich brauchte fast eine Stunde, um ihn zu lösen. Wenn ich die Insertionsmethode in maper.xml definiere, verwende ich normalerweise das <! [CDATA []]> -Tag, um die SQL -Anweisungen standardmäßig beizulegen, wie unten gezeigt:
<! [CDATA [SELECT * AUS T_TRAIN_RECORD T WHERE T.ACTIVITY_ID =#{ActivityID}]]> Dies liegt hauptsächlich daran, dass in XML -Elementen "<" und "&" illegal sind. "<" erzeugt einen Fehler, weil der Parser den Charakter als Beginn eines neuen Elements interpretiert. "&" erzeugt auch einen Fehler, weil der Parser den Charakter als Beginn der Charakterentität interpretiert. Das "<" oder "&" Charakter kann in der SQL -Anweisung oder der Skript -Anweisung existieren. Um Fehler zu vermeiden, kann die SQL -Anweisung als CDATA definiert werden. Alles im CDATA -Abschnitt wird vom Parser ignoriert.
Zu diesem Zeitpunkt habe ich diese Verwendung auch in der AddtrainRecordbatch -Methode verwendet:
<! [Cdata [in t_train_record einfügen (add_time, emp_id, activity_id, flag) Werte <foreach collection = "list" item = "item" index = "index" separator = ","> (#{item.Addtime},#{item.empid},#{itemptivy.activity},#{item.flag {item.flag}).Infolgedessen meldet das Programm bei der Ausführung immer einen Fehler: Beim Anzeigen der Fehlermeldung sind die in übergebenen Parameter null. Nach langer Zeit der Verwirrung wurde mir klar, dass <! [CDATA []]> das <Feach> -Tag in XML eingeschlossen und das Tag direkt als Zeichenfolge verarbeitet hat. Nach dem Entfernen der Außenseite <! [CDATA []]> kann es normal ausgeführt werden.