Récemment, j'ai fait une exigence d'importation par lots et l'insertion de plusieurs enregistrements dans la base de données.
Solution: encapsuler un objet de collection de liste dans le programme, puis insérer les entités de la collection dans la base de données. Parce que le projet utilise MyBatis, il est prévu d'utiliser la fonction Foreach de MyBatis pour l'insertion par lots. Au cours de cette période, j'ai rencontré l'erreur "La commande SQL ne s'est pas terminée correctement", et je l'ai finalement résolu et enregistrée pour une revue et un apprentissage futurs.
Tout d'abord, j'ai fait référence aux informations sur l'insert foreach de Mybatis en ligne, 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.
Ensuite, le fichier XML suivant a été écrit en fonction de la copie.
fichier xxxmapper.xml:
<insert id = "addSupCity" ParameterType = "java.util.list"> <SelectKey KeyProperty = "CityId" Order = "AVANT" ResultType = "String"> <! [CDATA [SELECT SEQ_OCL_SUPCITY.NEXTVAL à partir de DUAL]> </ SELECTKE Area_descs, sup_id, stat) valeurs <foreach collection = "list" item = "item" index = "index" séparateur = ","> (# {item.cityId, jdbcType = varchar}, # {item.citycode, jdbcType = varchar}, # {item.cityName, jdbcType = varchar}, # {item .AreaScs, jdbcType = varchar}, # {item.supid, jdbcType = varchar}, # {item.stat, jdbcType = varchar}) </ foreach> </sert>Cependant, après l'exécution, il continue de signaler les erreurs et le message d'erreur est le suivant:
### SQL: Insérer dans T_OCL_SUPCITY (City_id, City_code, City_name, Area_desc, Sup_id, Stat) (?,?,?,?,?,?), (?,?,?,?,?) ### Cause: Java.Sql.
La copie SQL Out et en cours d'exécution en PL / SQL rapporte également la même erreur. Comme on peut le voir ci-dessus, les instructions SQL exécutées à l'aide de l'insert par lots sont équivalentes à: insert dans T_OCL_SUPCITY (City_id, City_code, City_Name, Area_Desc, Sup_id, Stat) (?,?,?,?) inégalé. En regardant cet article, j'ai constaté que cela convient à MySQL et non à Oracle, j'ai donc modifié le fichier XML:
<insert id = "addSupCity" ParameterType = "java.util.list"> Insérer dans T_OCL_SUPCITY (City_id, City_Code, City_Name, Area_Desc, Sup_id, Stat) # {item.CityCode, jdbcType = varchar} city_code, # {item.cityName, jdbcType = varchar} city_name, # {item.areaDesc, jdbcType = varchar aire_desc, # {item.supid, jdbcType = varchar} Sup_id, # {item.stat, jdbcType = varchar} statfrom dual </foreach>) a </sert>Parcourir.
Dans la version d'Oracle, il y a quelques éléments à noter:
1. Il n'y a pas de valeurs dans SQL;
2. (Selece ...... de Dual);
3. L'attribut du séparateur dans la balise <Foreach> est "Union All", et la requête sera fusionnée dans l'ensemble de résultats.
Ce qui précède est une solution rapide à l'erreur d'insertion par lots d'Oracle + MyBatis ForEach INSERT Fonction vous a présentée par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!