Annuaire d'articles
Framework MyBatis SQL dynamique
Extrait de code pour SQL dynamique
Framework MyBatis SQL dynamique
Dynamic SQL, à travers les différents labels fournis par MyBatis pour juger des conditions de réalisation de l'épissage dynamique des instructions SQL. L'expression utilisée dans le jugement conditionnel ici est l'expression OGNL. Les balises SQL dynamiques couramment utilisées sont <if>, <where>, <choose/>, <foreach>, etc.
L'instruction SQL dynamique de MyBatis est très similaire à l'instruction dans JSTL.
Le SQL dynamique est principalement utilisé pour résoudre le problème des conditions de requête incertaines : lors de l'exécution du programme, la requête est effectuée en fonction des conditions de requête soumises par l'utilisateur. Les conditions de requête soumises sont différentes et les instructions SQL exécutées sont différentes. Si chaque situation possible est répertoriée une par une et que toutes les conditions sont organisées et combinées, il y aura un grand nombre d'instructions SQL. À ce stade, SQL dynamique peut être utilisé pour résoudre un tel problème.
Préparation environnementale
1. Créez un nouveau projet maven, ajoutez mybatis, les dépendances du pilote mysql
2. Créer la classe d'entités Student, l'interface StudentDao, StudentDao.xml, mybatis.xml, la classe de test
3. Utilisez le tableau précédent étudiant.
Dans le SQL dynamique du mappeur, s'il existe des symboles tels que supérieur à (>), inférieur à (=), inférieur ou égal à (<=), il est préférable de les convertir en symboles d'entité. Sinon, le XML peut rencontrer des erreurs d'analyse.
En particulier, le signe inférieur à (<) ne doit jamais apparaître en XML. Sinon, une erreur se produira lors de l'analyse du fichier de mappage.
Table des symboles d'entité :
< | moins que | < |
> | plus que le | > |
>= | supérieur ou égal à | >= |
<= | inférieur ou égal à | <= |
SQL dynamique si
Pour l'exécution de cette étiquette, lorsque la valeur de test est true, les fragments SQL qu'elle contient seront épissés dans l'instruction SQL où elle se trouve.
Syntaxe : <if test="condition"> partie de l'instruction SQL</if>
Méthode d'interface :
List<Student> selectStudentIf(Student student);
fichier mappeur :
<select id="selectStudentIf" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student
where 1=1
<if test="name != null and name !='' ">
and name = #{name}
</if>
<if test="age > 0 ">
and age > #{age}
</if>
</select>
méthode de test :
@Test
public void testSelect() throws IOException {
Student param = new Student();
param.setName("李力");
param.setAge(18);
List<Student> studentList = studentDao.selectStudentIf(param);
studentList.forEach( stu -> System.out.println(stu));
}
Où est le SQL dynamique
Il y a un endroit gênant dans la balise <if/> : vous devez ajouter manuellement une clause 1=1 après le where. Parce que, si toutes les conditions <if/> après where sont fausses, et s'il n'y a pas de clause 1=1 après where, alors il n'y aura qu'un seul emplacement vide dans SQL, et SQL fera une erreur.
Donc, après le où, vous devez ajouter la clause toujours vraie 1 = 1 pour éviter que cela ne se produise. Mais lorsque la quantité de données est importante, cela affectera sérieusement l'efficacité de la requête.
En utilisant la balise <where/>, lorsqu'il y a une condition de requête, la clause where peut être ajoutée automatiquement ; lorsqu'il n'y a pas de condition de requête, la clause where ne sera pas ajoutée. Il convient de noter que le fragment SQL dans la première balise <if/> ne peut pas contenir et.
Cependant, il est également bon d'écrire et, le système supprimera le et supplémentaire. Mais le et des autres fragments SQL dans <if/> doivent être écrits. Sinon, l'instruction SQL sera concaténée de manière incorrecte.
Syntaxe : <where> autre sql dynamique</where>
Méthode d'interface :
List<Student> selectStudentWhere(Student student);
fichier mappeur :
<select id="selectStudentWhere"
resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student
<where>
<if test="name != null and name !='' ">
and name = #{name}
</if>
<if test="age > 0 ">
and age > #{age}
</if>
</where>
</select>
méthode de test :
@Test
public void testSelectWhere() throws IOException {
Student param = new Student();
param.setName("李力");
param.setAge(18);
List<Student> studentList = studentDao.selectStudentWhere(param);
studentList.forEach( stu -> System.out.println(stu));
}
foreach de SQL dynamique
La balise <foreach/> est utilisée pour parcourir les tableaux et les collections. Lors de son utilisation, vous devez faire attention à:
- collection représente le type de collection à parcourir, list , array, etc.
- open, close et separator sont des épissures SQL du contenu traversé.
grammaire:
<foreach collection="集合类型" open="开始的字符" close="结束的字符"
item="集合中的成员" separator="集合成员之间的分隔符">
#{item 的值}
</foreach>
1. Liste de parcours<type simple>
La liste dans l'expression est représentée par list et sa taille est représentée par list.size.
Exigence : l'ID étudiant de la requête est 1002,1005,1006
Méthode d'interface :
List<Student> selectStudentForList(List<Integer> idList);
fichier mappeur :
<select id="selectStudentForList"
resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student
<if test="list !=null and list.size > 0 ">
where id in
<foreach collection="list" open="(" close=")"
item="stuid" separator=",">
#{stuid}
</foreach>
</if>
</select>
méthode de test :
@Test
public void testSelectForList() {
List<Integer> list = new ArrayList<>();
list.add(1002);
list.add(1005);
list.add(1006);
List<Student> studentList = studentDao.selectStudentForList(list);
studentList.forEach( stu -> System.out.println(stu));
}
2. Liste de parcours <type d'objet>
Méthode d'interface :
List<Student> selectStudentForList2(List<Student> stuList);
fichier mappeur :
<select id="selectStudentForList2"
resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student
<if test="list !=null and list.size > 0 ">
where id in
<foreach collection="list" open="(" close=")"
item="stuobject" separator=",">
#{stuobject.id}
</foreach>
</if>
</select>
méthode de test :
@Test
public void testSelectForList2() {
List<Student> list = new ArrayList<>();
Student s1 = new Student();
s1.setId(1002);
list.add(s1);
s1 = new Student();
s1.setId(1005);
list.add(s1);
List<Student> studentList = studentDao.selectStudentForList2(list);
studentList.forEach( stu -> System.out.println(stu));
}
Extrait de code pour SQL dynamique
La balise <sql/> est utilisée pour définir des fragments SQL à réutiliser par d'autres balises SQL. Pour que d'autres balises utilisent ce fragment SQL, la sous-balise <include/> est requise. La balise <sql/> peut définir n'importe quelle partie de l'instruction SQL, de sorte que la sous-balise <include/> peut être placée n'importe où dans le SQL dynamique.
Méthode d'interface :
List<Student> selectStudentSqlFragment(List<Student> stuList);
fichier mappeur :
<!--创建 sql 片段 id:片段的自定义名称-->
<sql id="studentSql">
select id,name,email,age from student
</sql>
<select id="selectStudentSqlFragment"
resultType="com.bjpowernode.domain.Student">
<!-- 引用 sql 片段 -->
<include refid="studentSql"/>
<if test="list !=null and list.size > 0 ">
where id in
<foreach collection="list" open="(" close=")"
item="stuobject" separator=",">
#{stuobject.id}
</foreach>
</if>
</select>
méthode de test :
@Test
public void testSelectSqlFragment() {
List<Student> list = new ArrayList<>();
Student s1 = new Student();
s1.setId(1002);
list.add(s1);
s1 = new Student();
s1.setId(1005);
list.add(s1);
List<Student> studentList = studentDao.selectStudentSqlFragment(list);
studentList.forEach( stu -> System.out.println(stu));
}