L'auteur est toujours un ingénieur débutant qui a rejoint l'entreprise en 2018.
Donc le niveau de l'article n'est pas très élevé,
Je veux laisser les points auxquels j'étais accro lors de l'écriture de code en entreprise pour les futurs juniors! !!
→ Si vous voulez quand même le laisser, je veux l'écrire en Qiita! !! J'ai pensé et posté.
C'est l'histoire quand je faisais du développement backend avec Spring + MyBatis.
N objets envoyés à partir de la requête par la fonction en charge,
Après avoir traversé la logique, j'ai utilisé MyBatis pour mettre à jour plusieurs éléments.
Avant de parler de cette fois, parlons légèrement de My Batis.
MyBatis est un framework de mappage OR qui décrit SQL en XML.
Même si le développeur ne prend pas la peine d'écrire du SQL dans le mappeur OR Certains sont garantis un traitement CRUD normal,
MyBatis ose faire des jointures compliquées par écriture SQL,
Vous pouvez mapper des SQL spéciaux tels que des instructions UPSERT à des objets Java,
Les instructions If, foreach, etc. peuvent être écrites dans la partie SQL et du SQL dynamique peut être généré.
Exemple) L'instruction INSERT peut être écrite comme suit.
Fichier Java
public interface UserRepository{
public int insertUser(List<User> userList);
}
Fichier XML
<insert id="insertUser" parameterType="java.util.List">
INSERT INTO users(
user_id
, user_name
, user_mail
)
VALUES
<foreach item="user" collection="list" open="" separator="," close="">
(
#{userId, jdbcType=BIGINT}
, #{userName, jdbcType=VARCHAR}
, #{userEmail, jdbcType=VARCHAR}
)
</foreach>
</insert>
Dans le cas ci-dessus, remplissez l'objet Utilisateur avec la valeur que vous souhaitez enregistrer, En les transformant en liste et en les transmettant au mappeur OR, plusieurs INSERTs peuvent être effectués avec une émission de requête. Cette émission unique est bonne et vous pouvez réduire le nombre d'accès à la base de données sans dégrader les performances.
Tournons Update en boucle avec la colle ci-dessus! J'en suis accro.
Plus précisément, lorsque le SQL suivant est écrit. (Java est omis)
Fichier XML
<update id ="updateUser" parameterType= "java.util.List" >
<foreach collection ="itemList" item="item" separator= ";">
update users
<set>
user_name = #{userName, jdbcType=VARCHAR}
, user_email = #{userEmail, jdbcType=VARCHAR}
</set >
WHERE user_id = #{userId, jdbcType=VARCHAR}
</foreach>
</update >
Par exemple, supposons que vous souhaitiez mettre à jour "Ah" et "Ii" avec le SQL ci-dessus. La requête émise par ceci est la suivante.
SQL émis
update users
set
user_name = 'Ah ah',
user_email = '[email protected]'
where user_id = '001';
update users
set
user_name = 'Bien',
user_email = '[email protected]'
where user_id = '002';
À première vue, cela a l'air bien, mais lorsque vous essayez de le traiter, une erreur se produit. Cependant, si ce SQL émis est envoyé directement à la table, le processus se terminera normalement.
Cela a du sens en termes de Mybatis, ou de méthodes Java (du moins pour moi).
En tant que comportement de Java, j'appellerai une méthode appelée updateUser.
Parmi elles, n requêtes sont émises pour accéder à la base de données.
À ce stade, le nombre d'observations traitées par une émission de requête est renvoyé en tant que valeur de retour à la classe appelante.
Dans le cas de l'instruction Update ci-dessus, plusieurs requêtes sont émises avec un seul appel de méthode, donc
Une erreur se produit si vous essayez de renvoyer plusieurs valeurs de retour.
Comme je l'ai écrit dans la section où j'ai parlé de My Batis, dans le cas de l'instruction Insert ** Parce que plusieurs processus sont exécutés en émettant une seule requête ** Même si vous enregistrez deux cas avec un seul appel de méthode Seule la valeur de retour est "2" et le nombre de valeurs de retour est de un, de sorte que le processus se termine normalement.
Si la base de données peut utiliser des instructions UPSERT telles que mySQL, décrivez DUPLICATE KEY et écrivez-la. Il peut être résolu en utilisant UPSERT.
Exemple de traitement UPSERT
<insert id="upsertUser" parameterType="java.util.List">
INSERT INTO users (
user_id
, user_name
, user_mail
)
VALUES
<foreach item="user" collection="list" open="" separator="," close="">
(
#{userId, jdbcType=BIGINT},
#{userName, jdbcType=VARCHAR},
#{userEmail, jdbcType=VARCHAR},
)
</foreach>
ON DUPLICATE KEY UPDATE
user_name = VALUES(userName),
user_email = VALUES(userEmail)
</insert>
Avec le SQL ci-dessus, une instruction INSERT sera émise une fois même à partir de l'objet à mettre à jour. Pour les instructions INSERT qui entraîneraient une violation de contrat unique au moment de l'exécution Le processus passe à l'instruction Update décrite dans ON DUPLICATE KEY UPDATE. Par conséquent, si n objets de mise à jour sont passés à ce processus, ** En conséquence, plusieurs mises à jour peuvent être effectuées en émettant une seule requête **, et le processus est effectué normalement.
Merci d'avoir lu jusqu'au bout. Si vous trouvez quelque chose d'étrange, veuillez le signaler. De plus, je continuerai à publier des articles, donc tout conseil d'écriture est le bienvenu!
Recommended Posts