En l'état, c'est une série qui résume les outils etc. appris (utilisés) sur le terrain. Je l'écris avec le sentiment que c'est aussi pour moi et que ça devrait être pour quelqu'un. Nous attendons avec impatience vos suggestions et commentaires concernant les erreurs et les méthodes de description!
Comment écrire des conseils
Un cadre pour le mappage d'instructions et d'objets SQL à l'aide de XML ou d'annotations.
Sans parler du fonctionnement normal du CRUD Vous pouvez émettre du SQL dynamiquement en fonction de l'état des paramètres! Si une description peut être réutilisée plusieurs fois, elle peut être partagée et la quantité de description peut être réduite.
Dans cet article, j'expliquerai principalement la description de XML.
Quoi qu'il en soit, il est plus rapide de consulter la source, alors veuillez voir ci-dessous.
Sample.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="src.mapper.MybatisMapper">
<select id="select" resultType="src.mapper.entity.TableEntity">
select
*
from
table_name
</select>
<insert id="insert">
insert into table_name (
id,
name,
age,
department
) values (
#{id},
#{name},
#{age},
#{department}
)
</insert>
</mapper>
MyBatisMepper.java
package src.mapper
//importation omise
public interface MyBatisMapper {
TableEntity select();
void insert(TableEntity entity);
}
TableEntity.java
package src.mapper.entity
//importation omise
public class TableEntity {
private String id;
private String name;
private Integer age;
private String department;
public void setId(String id) {
this.id = id;
}
public String getId() {
return this.id;
}
//Getter, setter pour tous les domaines
}
Pour expliquer brièvement,
<mapper namespane =" src.mapper.MybatisMapper ">
.<select id =" select "resultType =" src.mapper.entity.TableEntity "> ~ </ select>
, et le résultat est mappé à TableEntity. Sera fait.# {id}
. Dans ce qui précède, la valeur est passée en tant qu'objet, mais elle peut également être reçue en tant qu'argument de la classe Mapper en utilisant @ Param
.Il est très facile de se lier aux classes et méthodes java, donc c'est facile à comprendre intuitivement!
Si vous pouvez préparer une classe de données comme décrit ci-dessus, vous pouvez mapper par nom de champ. (J'ai l'impression que ça aurait été inutile sans un getter) Cependant, pour diverses raisons, pour ceux qui veulent le passer comme argument de la classe mapper! Voici quelques moyens de le faire.
# {param1}
SampleParam1.xml
<select id="select" resultType="src.mapper.entity.TableEntity">
select
*
from
table_name
where
id = #{param1}
and name = #{param2}
</select>
MyBatisMepper.java
package src.mapper
//importation omise
public interface MyBatisMapper {
TableEntity select(String id, String name);
}
Si vous écrivez comme ceci, # {param1}
aura le premier argument ʻid, Le deuxième argument,
name, est mappé à
# {param2}`!
Il est difficile de comprendre personnellement la cartographie dans l'ordre des arguments, ce n'est donc pas recommandé.
@ Param
à l'argument de la classe mapperSampleParam2.xml
<select id="select" resultType="src.mapper.entity.TableEntity">
select
*
from
table_name
where
id = #{id}
and name = #{name}
</select>
MyBatisMepper.java
package src.mapper
//importation omise
public interface MyBatisMapper {
TableEntity select(@Param("id") String id, @Param("name") String name);
}
En spécifiant un alias avec une chaîne de caractères dans l'argument de @ Param
Vous pouvez mapper des paramètres en XML.
Personnellement, c'est le plus simple à comprendre et à recommander!
Comme créer une classe de données
Ceci est une méthode pour créer une carte avec clé = nom de paramètre
et valeur = valeur
.
[Cliquez ici pour plus de détails](https://qiita.com/opengl-8080/items/a9b5d4038f19d4813ee6#map-%E3%81%A7%E3%83%91%E3%83%A9%E3%83%A1%E3 Voir% 83% BC% E3% 82% BF% E3% 82% 92% E6% B8% A1% E3% 81% 99).
(Si vous faites cela, je pense que ce serait plus facile à comprendre si vous créiez une classe de données.)
Ensuite, je vais vous présenter comment écrire du SQL dynamique!
Comme mentionné ci-dessus, le SQL dynamique signifie que le SQL émis par l'état du paramètre peut être modifié dynamiquement! Plus précisément, c'est comme suit!
if/choose/where,set,trim Par exemple, vous devez écrire plusieurs instructions SELECT similaires car les colonnes référencées sont les mêmes mais les conditions (clause WHERE) sont différentes. .. C'est dommage, non? ** if / choose / where, set, trim **, qui sera présenté ci-dessous, est une méthode de description pratique lorsque vous souhaitez modifier les conditions de la clause WHERE ou lorsque vous souhaitez unifier l'instruction UPDATE.
if
SampleIf.xml
<update id="update">
update table_name
set
<if test="name != null">
name = #{name},
</if>
age = #{age}
where
id = #{id}
</update>
Selon la situation, j'aimerais choisir parmi plus de conditions que deux choix! Je pense qu'il y aura des cas comme celui-là. Dans ce cas, veuillez utiliser ** choose (quand, sinon) **. (Je ne l'ai pas tellement vu) choose(when,otherwise)
SampleChoose.xml
<select id="select">
select
*
from
table_name
where
<choose>
<when test="id != null">
id = #{id}
</when>
<when test="name != null">
name = #{name}
</when>
<otherwise>
age = #{age}
</otherwise>
</choose>
</select>
select * from table_name où nom =?
select * from table_name where age =?
where,set,trim ** where, set, trim ** sont utiles lorsque vous voulez travailler avec un peu de SQL maladroit. Par exemple, prenez le SQL suivant.
Sample2.xml
<select id="select2" resultType="src.mapper.entity.TableEntity">
select
*
from
table_name
where
<if test="id != null">
id = #{id}
</if>
<if test="name != null">
and name = #{name}
</if>
<if test="age != null">
and age = #{age}
</if>
</update>
Si tous les if ne sont pas satisfaits, le code SQL select * from table_name where
sera émis et une erreur de syntaxe se produira.
De plus, si le paramètre .name n'est pas nul et que les paramètres .id et age sont nuls, alors select * from table_name where and name =?
Se produira, ce qui entraînera également une erreur de syntaxe.
where
Si vous utilisez <where> ~ </ where>
, il n'insérera où que lorsque l'une des balises incluses renvoie un résultat.
De plus, si le résultat de la balise contenue commence par «et» ou «ou», ils seront supprimés!
Comme c'est pratique! .. ..
SampleWhere.xml
<select id="select2" resultType="src.mapper.entity.TableEntity">
select
*
from
table_name
<where>
<if test="id != null">
id = #{id}
</if>
<if test="name != null">
and name = #{name}
</if>
<if test="age != null">
and age = #{age}
</if>
</where>
</select>
ou ʻou
à la fin des éléments dans <if> ~ </ if>
, ils ne seront pas supprimés!
De plus, bien qu'il soit très détaillé, ʻet (espace demi-largeur) ʻet ʻou (espace demi-largeur) `sont ciblés pour être supprimés, donc l'utilisation des onglets peut ne pas fonctionner correctement.set
Il s'agit de la version de clause set de where.
Si vous utilisez <set> ~ </ set>
, le supplément ,
sera supprimé.
SampleSet.xml
<update id="update">
update table_name
<set>
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
<if test="department != null">
department = #{department}
</if>
</set>
where
id = #{id}
</update>
where
, les` et ʻà la fin ** sont supprimés!trim
La personnalisation est possible en définissant le where
et set
décrit ci-dessus dans<trim> to </ trim>
.
Cela peut paraître subtil compte tenu de la lisibilité, mais je pense que cela vaut la peine de le savoir!
SampleTrim1.xml
<select id="select2" resultType="src.mapper.entity.TableEntity">
select
*
from
table_name
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test="id != null">
id = #{id}
</if>
<if test="name != null">
and name = #{name}
</if>
<if test="age != null">
and age = #{age}
</if>
</trim>
</select>
<set> ~ </ set>
est remplacé par ** trim **SampleTrim2.xml
<update id="update">
update table_name
<trim prefix="SET" suffixOverrides=",">
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
<if test="department != null">
department = #{department}
</if>
</trim>
where
id = #{id}
</update>
sql,include
Par exemple, si vous avez besoin d'une instruction SELECT pour l'acquisition et d'une instruction SELECT pour la mise à jour
N'est-ce pas comme ça quand je l'ai écrit, il n'y avait qu'une différence avec ou sans «pour mise à jour» à la fin?
Dans un tel cas, utiliser <sql> ~ <sql>
et <include> ~ </ include>
le rendra plus propre!
SampleSql.xml
<sql id="selectBase">
select
*
from
table_name
where
id = #{id}
</sql>
<select id="select" resultType="src.mapper.entity.TableEntity">
<include refid="selectBase" />
</select>
<select id="selectForUpdate" resultType="src.mapper.entity.TableEntity">
<include refid="selectBase" />
for update
</select>
Je prendrai des notes d'un point de vue plus pratique!
Dans MyBatis, il existe deux façons d'écrire des variables.
--# {param}
… S'échapper et mettre entre guillemets simples.
--$ {param}
... Ne vous échappez pas.
Voici une façon courante d'écrire. (Si vous voulez faire correspondre le préfixe avec id)
SampleSql.xml
<select id="select3" resultType="src.mapper.entity.TableEntity">
select
*
from
table_name
where
id like '${id}%'
</select>
Cette façon d'écrire émettra toujours la bonne requête, Comme mentionné ci-dessus ** Il existe un risque d'injection SQL car elle ne s'échappe pas. ** **
Assurez-vous d'utiliser les ** jointures de chaîne fournies par chaque SQL. ** ** Ce qui suit est pour Oracle.
SampleSql.xml
<select id="select3" resultType="src.mapper.entity.TableEntity">
select
*
from
table_name
where
id like #{id} || '%'
</select>
Puisque MyBatis est décrit en XML, le nombre d'inégalité <>
est traité comme un méta caractère,
La requête ne peut pas être lue normalement.
Dans un tel cas, vous pouvez l'utiliser en le plaçant dans <![CDATA [...]]>
!
SampleSql.xml
<select id="select4" resultType="src.mapper.entity.TableEntity">
<![CDATA[
select
*
from
table_name
where
create_at < #{date}
]]>
</select>
Je pense qu'il est plus lisible de renfermer tout le SQL que de le placer avec des points précis. Je recommande personnellement le style d'écriture ci-dessus!
Quand j'essaye de sortir comme ça, J'ai une bonne idée de la façon dont je ** l'utilise et ne le comprends pas **. Je continuerai à publier des articles régulièrement, donc si vous avez une autre chance, merci. Jusqu'à la fin Merci d'avoir lu!
MyBatis Official-Dynamic SQL MyBatis Official --XML File
Recommended Posts