Un objet de collection de liste est encapsulé dans le programme, puis les entités de la collection doivent être insérées dans la base de données. Étant donné que le projet utilise la configuration Spring + MyBatis, il est prévu d'utiliser l'insertion de lots MyBatis. Comme il n'y a pas eu d'insertion par lots auparavant, je l'ai finalement implémenté après avoir recherché des informations sur Internet et publié le processus détaillé.
La structure de la classe Entity Class est la suivante:
classe publique FormRecord implémente Serialisable {private statique final long SerialVersionUID = -1206960462117924923l; ID long privé; Activité longue privéeId; Empid long privé; Flag privé int; String privé addtime; // setter et getter} Le mappeur correspondant.xml est défini comme suit:
<resultMap type = "trainRecord" id = "trainRecordResultMap"> <id Column = "id" propriété = "id" jdbcType = "bigInt" /> <result Column = "add_time" Property = "addtime" JDBCTYPE = "Varchar" /> <Result Column = "Emp_id" Property = "Empid" JdbcType = "BigInt" Column = "Activity_id" Property = "ActivityId" JDBCTYPE = "BigInt" /> <Result Column = "Activity_id" Property = "ActivityId" JDBCTYPE = "BigInt" /> <Result Column = "Flag" Property = "Status" JDBCTYPE = "VARCHAR" /> </ RESTCULDMAP>
La définition de la méthode d'insertion par lots dans Mapper.xml est la suivante:
<insert id = "addTrainRecordBatch" useGeneratedKeys = "true" ParameterType = "java.util.list"> <selectKey resultType = "long" keyproperty = "id" order = "After"> SELECT LAST_INST_ID () </ selectKey> insert dans T_train_record (add_time, emp_id, activité_id, drapeau) item = "item" index = "index" séparateur = ","> (# {item.addtime}, # {item.empid}, # {item.activityId}, # {item.flag}) </foreach> </sert>L'explication de la balise Foreach est référencée en ligne des informations, comme suit:
Foreach est principalement utilisé dans la construction dans des conditions, il peut itérer une collection dans les instructions SQL. Les attributs de l'élément foreach incluent principalement l'élément, l'index, la collecte, l'ouverture, le séparateur et la fermeture. L'élément représente l'alias lorsque chaque élément de la collection est itéré. L'index spécifie un nom pour représenter la position à laquelle chaque itération est atteinte pendant le processus d'itération. Open représente ce qui commence par l'instruction, le séparateur représente les symboles utilisés comme séparateurs entre chaque itération, et la fermeture représente ce qui se termine. La chose la plus critique et la plus sujette aux erreurs lors de l'utilisation de Foreach est l'attribut de collection. Cet attribut doit être spécifié, mais dans différents cas, la valeur de l'attribut est différente. Il y a trois situations principales:
1. Si le passait dans un seul paramètre et que le type de paramètre est une liste, la valeur d'attribut de collection est la liste
2. Si le passait dans un seul paramètre et que le type de paramètre est un tableau, la valeur de la propriété de la collection est le tableau
3. S'il y a plusieurs paramètres passés, nous devons les encapsuler dans une carte. Bien sûr, un seul paramètre peut également être encapsulé dans une carte.
Je n'énumerai pas les exemples spécifiques sur Forach ici. Je peux donner un exemple de chaque situation si j'en ai l'occasion à l'avenir.
Mysqlbasedao:
La classe publique MySqlBasedao étend SqlSessionDaOsupport {/ ** * INSERT: INSERT FONCTIONNEMENT. <br/> * * @author Chenzhou * @param Méthode Méthode Nom de l'opération d'insertion * @param Paramètre de requête entité ou classe d'entité * @return Renvoie le nombre de lignes affectées * @Since jdk 1.6 * / public int insert (méthode de chaîne, entité d'objet) {return this.getsqlSession (). insert (méthode, entity); } // D'autres méthodes sont omises} Le TrainRecorddao correspondant à la classe ENTITY DE TRAWRALCORD est défini comme suit:
classe publique FormRecorddao étend MySQLLBasedao {/ ** * addTrainRecordBatch: enregistrements de formation par lots. <br/> * * @Author Chenzhou * @param FormRecordlist Training Record List Collection * @return Numéro de lignes affectées * @Since JDK 1.6 * / public int addtrainRecordBatch (list <RentReCord> formRecordList) {return this.insert ("addtrainRecredBatch", emballestlist); } // omettre les méthodes restantes} Ensuite, appelez directement la méthode addtrainRecordBatch dans trainRecordDao et vous pouvez l'insérer par lots.
Il est particulièrement noté que j'ai rencontré une erreur sans voix lorsque je l'ai essayé, et il m'a fallu presque une heure pour le résoudre. Lorsque je définis la méthode d'insertion dans mapper.xml, j'utilise généralement la balise <! [Cdata []]> pour enfermer les instructions SQL par défaut, comme indiqué ci-dessous:
<! [Cdata [select * from t_train_record t where t.activity_id = # {activityId}]]> C'est principalement parce que dans les éléments XML, "<" et "&" sont illégaux. "<" produit une erreur car l'analyseur interprète le caractère comme le début d'un nouvel élément. "&" produit également une erreur car l'analyseur interprète le caractère comme le début de l'entité de caractère. Le caractère "<" ou "&" peut exister dans l'instruction SQL ou l'instruction Script. Pour éviter les erreurs, l'instruction SQL peut être définie comme CDATA. Tout dans la section CDATA est ignoré par l'analyseur.
À ce moment-là, j'ai également utilisé cette utilisation dans la méthode AddTrainRecordBatch:
<! [Cdata [insérer dans t_train_record (add_time, emp_id, activité_id, file
En conséquence, le programme signale toujours une erreur lors de l'exécution: com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerRorexception. Lors de l'affichage du message d'erreur, les paramètres passés sont nuls. Après une longue période de confusion, j'ai réalisé que <! [CDATA []]> Incluait la balise <Foreach> dans XML et traité directement la balise en tant que chaîne. Après avoir retiré l'extérieur <! [Cdata []]>, il peut être exécuté normalement.