Description de l'arrière-plan: Habituellement, si vous devez mettre à jour plusieurs données à la fois, il existe deux façons de la mettre à jour une par une. (1) Loopage via le code commercial pour mettre à jour un par un. (2) Mettre à jour toutes les données à la fois (pour être plus précis, il s'agit d'une instruction SQL pour mettre à jour toutes les données, mettre les opérations de mise à jour une par une du côté de la base de données, et le côté du code métier est de mettre à jour toutes les données à la fois). Les deux méthodes ont leurs avantages et leurs inconvénients. Les éléments suivants analyseront brièvement les avantages et les inconvénients des deux méthodes et introduiront principalement la mise en œuvre de la deuxième méthode dans MyBatis.
Mettre à jour un par un
Cette méthode est évidemment la plus simple et la moins sujette aux erreurs. Même si une erreur se produit, elle affecte uniquement les données d'erreur. Il peut être contrôlé par chaque élément de données. Si la mise à jour échoue ou réussit, elle peut être obtenue à partir de quel contenu est mis à jour à quel contenu. Le code peut ressembler à ceci:
UpdateBatch (list <MyData> dataS) {for (myData data: dataS) {try {mydatadao.update (data); // mettent à jour une données, la mise à jour du fichier XML ci-dessous dans MyBatis} Catch (exception e) {... // Si la mise à jour échoue, vous pouvez effectuer d'autres opérations, telles que l'origine pour une erreur d'erreur, etc. MyBatis <Datedate> Mettez à jour le jeu MyData ... où ... </fatedate>Le plus gros problème avec cette méthode est le problème d'efficacité. Il met à jour un par un et se connecte à la base de données à chaque fois, puis met à jour, puis publie les ressources de connexion (bien que l'efficacité des données fréquemment connectées puisse être considérablement améliorée via le pool de connexion, qui ne peut pas résister à la grande quantité de données). Cette perte reflétera le problème d'efficacité lorsque la quantité de données est importante. C'est également à ce moment-là que la satisfaction des besoins de l'entreprise, la deuxième implémentation de mise à jour par lots mentionnée ci-dessus est généralement utilisée (bien sûr, cette méthode a également des limitations d'échelle de données, qui seront mentionnées plus loin).
Mise à jour par lots SQL
Une instruction SQL est utilisée pour mettre à jour toutes les données par lots. Jetons un coup d'œil à la façon dont il est généralement écrit dans Mybatis (supprimer la syntaxe MyBatis est l'instruction SQL native, donc je ne parle pas de la façon dont il est écrit dans SQL).
<update id = "updateBatch" ParameterType = "java.util.list"> update mydata_table set status = <foreach collection = "list" item = "item" index = "index" séparateur = "" open = "case id" close = "end"> quand # {item.id} alors # {item.status} </ foreach> où id id dans <pour la collection = " séparateur = "," open = "(" close = ")"> # {item.id, jdbcType = bigInt} </foreach> </dated>Où quand ... alors ... est la syntaxe "Switch" dans SQL. Ici, la syntaxe <Foreach> de Mybatis est utilisée pour reconstituer la mise à jour par lots SQL. Ce qui précède signifie que le champ d'état des données transmis dans la liste d'ID dans le paramètre UpdateBatch est mis à jour par lots. Vous pouvez également utiliser <Trimin> pour implémenter la même fonction, le code est le suivant:
<update id = "updateBatch" ParameterType = "java.util.list"> Update myData_Table <Trim prefix = "set" suffixOverrides = ","> <Trim prefix = "status = case" suffix = "end,"> <foreach collection = "list" item = "item" index = "index"> quand id = # {item.id ord # {item ". </prim> </ Trim> où id dans <foreach collection = "list" index = "index" item = "item" séparateur = "," open = "(" close = ")"> # {item.id, jdbcType = bigInt} </FoEach> </ Update><mit> Description de la propriété
1.Prefix, le suffixe signifie l'ajout de contenu devant ou après la pièce enveloppée dans la balise de garniture
2. S'il y a des préfixoverrides en même temps, SuffixOverrides signifie que le contenu dans les remplacements sera écrasé avec le préfixe et le suffixe.
3. Si seulement les préfixoverrides, SuffixOverrides signifie supprimer le contenu spécifié par xxxoverides au début ou à la fin.
Le code ci-dessus est converti en SQL comme suit:
mettre à jour MyData_Table set status = case when id = # {item.id} puis # {item.status} // Ce devrait être la valeur <Foreach> Expand ... end where id in (...);Bien sûr, il s'agit de l'implémentation de mise à jour par lots la plus facile. Parfois, plusieurs champs peuvent devoir être mis à jour, vous devez donc
<trim prefix = "status = case" suffix = "end,"> <foreach collection = "list" item = "item" index = "index"> quand id = # {item.id} alors # {item.status} </foreach> </mim>Copiez plusieurs fois, modifiez le contenu du préfixe et quand ... alors ... et si vous devez définir la valeur par défaut pour un certain champ, vous pouvez utiliser d'autre
<trim prefix = "status = case" suffix = "end,"> <foreach collection = "list" item = "item" index = "index"> quand id = # {item.id} alors # {item.status} </ foreach> else default_value </mit>Il existe également une situation plus courante où les données à mettre à jour doivent être jugées, et seules les données qui remplissent les conditions peuvent être mises à jour. Cette situation peut être effectuée:
<trim prefix = "status = case" suffix = "end,"> <foreach collection = "list" item = "item" index = "index"> <if test = "item.status! = null et item.status! = -1"> quand id = # {item.id} alors # {item.status} </ if> </ foreach> </prim> Dans ce cas, seul status != null && status != -1 Les données de la liste à mettre à jour peuvent être mises à jour. D'autres seront mis à jour avec des valeurs par défaut, sans garder les données d'origine inchangées. Et si vous souhaitez garder les données d'origine inchangées? Autrement dit, les mises à jour qui remplissent les conditions, et celles qui ne remplissent pas les conditions restent inchangées. Un moyen simple de le faire est d'ajouter un autre <f>, car il y a non si ... sinon ... syntaxe dans mybatis, mais le même effet peut être réalisé via plusieurs <f>, comme suit:
<trim prefix = "status = case" suffix = "end,"> <foreach collection = "list" item = "item" index = "index"> <if test = "item.status! = null et item.status! = -1"> quand id = # {item.id} alors # {item.status} </ if> <if test = "item.status == null ou élément. id = # {item.id} puis mydata_table.status // Ceci est les données d'origine </ if> </foreach> </mim>La mise à jour globale du lot est écrite comme suit:
<update id = "updateBatch" ParameterType = "java.util.list"> Update myData_Table <Trim Prefix = "set" suffixOverrides = ","> <Trim prefix = "status = case" suffix = "end,"> <foreach collection = "list" item = "item" index = "index> <if test =" item.statur! id = # {item.id} puis # {item.status} </ if> <if test = "item.status == null ou item.status == -1"> quand id = # {item.id} alors mydata_table.status // dataes original </ if> </ pourhey " séparateur = "," open = "(" close = ")"> # {item.id, jdbcType = bigInt} </foreach> </dated>Cette méthode de base de données par lots et principaux peut mettre à jour toutes les données dans une connexion de base de données, en évitant les frais généraux de l'établissement et de la déconnexion fréquents de la base de données, et améliorant considérablement l'efficacité de mise à jour des données. Cependant, le problème est que si une erreur de mise à jour se produit au cours de ce processus, il sera difficile de savoir quelles données ne sont pas. Si la propre garantie de transaction de la données est utilisée, une fois qu'une erreur se produit, toutes les mises à jour seront automatiquement annulées. Et cette méthode est souvent plus sujette aux erreurs. Par conséquent, la solution habituelle consiste à faire des compromis, c'est-à-dire pour mettre à jour une partie de celui-ci par lots (la pagination est effectuée, par exemple, il y a un total de 1 000 éléments de données, et 100 éléments de données sont mis à jour à la fois). Cela peut partager la probabilité d'erreurs et il est plus facile de localiser l'erreur.
Bien sûr, si la quantité de données est vraiment importante, cette mise à jour par lots conduira également à des mises à jour inefficaces (par exemple, si 100 éléments sont mis à jour à la fois, si 1 milliard de données sont mises à jour, 10 millions de fois seront nécessaires à la mise à jour par lots 10 millions de fois et que 10 millions de bases de données seront établies et déconnectées, ce qui est insupportable). Pour le moment, vous ne pourrez peut-être considérer que d'autres solutions, comme l'introduction d'un mécanisme de mise en cache.
Résumer
Ce qui précède est le lot UpdateBatch présenté par l'éditeur en utilisant UpdateBatch dans MyBatis. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!