动态sql
一:if标签使用:
我们在查询的时候,有时候由于查询的条件的不确定性,导致where的后面的条件的不同,这时候就需要我们进行where后面的条件进行拼接。
Mapper配置文件:
1 <?xml version="1.0" encoding="UTF-8" ?>
2 /p>
4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6
7 SELECT * FROM t_account WHERE 1=1AND8
9 NAME LIKE '%${ac.name}%'
10
11
12 AND id >#{ac.id}13
14
15
注意:我们需要使用SELECT * FROM t_account WHERE 1=1 AND 条件1 AND 条件2.。。。。。这种使用。
其中if标签中的test表达式是测试条件和字段是否为空或者nul,注意这里也是属性.属性。
实际的输出语句:
2018-04-25 18:40:14,733 DEBUG [main] voMapper.findAccByIdAndName.debug:139 | ==> Preparing: SELECT * FROM t_account WHERE 1=1 AND NAME LIKE '%ok%' AND id >?
二、where标签:可以帮我们补全where关键字也不需要1=1的条件:
1 <?xml version="1.0" encoding="UTF-8" ?>
2 /p>
4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6
7 SELECT *FROM t_account8
9
10 NAME LIKE '%${ac.name}%'
11
12
13 And id >#{ac.id}14
15
16
17
18
sql语句:
如果别的查询语句也需要这些条件 我们可以进行重用。
在标签下面 使用sql标签。
1 <?xml version="1.0" encoding="UTF-8" ?>
2 /p>
4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6
7
8
9 NAME LIKE '%${ac.name}%'
10
11
12 And id >#{ac.id}
13
14
15
16
17
18 SELECT *FROM t_account19
20
21
22
其种id是唯一是别人调用的时候标识。
相应的引用使用的标签是include标签。
1
这样这部分的条件可以进行复用。
三、foreach的标签
当前端传来一些列的id,为列表的时候,我们可以使用id进行查询。这时候sql使用的是in而 不是or or的效率很低。
1
2 #{xx}3
首先了解下foreach的里的属性意思:
1、collection:集合,就是传入的变量的集合的名称。这个需要跟你传入的对象内的属性字段相对应!
2、item:循环的元素,将元素放入这个item中(是将ids的元素放在item里面不是一个而是整个集合)。
3、open:循环开始的拼接符。
4、colse:循环结束的拼接符。
5、separator:就是sql语句中集合内的元素之间的分隔符。
6、#{xx}:取出item的集合。这个名字要和item的名字一样。因为是同一个变量的名称。
完整的例子:
1
2 SELECT *FROM t_account3
4
5 #{xx}6
7
8
9
10
其中的where标签可以有也可以没有,只是在foreach中的open拼接的时候需要注意带不带where就可以。
其中parameterType不能写:List 会报:columnNumber: 53; 与元素类型 "select" 相关联的 "parameterType" 属性值不能包含 '
vo类:
1 package jd.com.vodemo;2 import jd.com.mybaitstest.account;3
4 import java.util.List;5
6 public classvodemo {7 private Listids;8
9 privateaccount ac;10
11 public voidsetAc(account ac) {12 this.ac =ac;13 }14
15 publicaccount getAc() {16 returnac;17 }18
19 public void setIds(Listids) {20 this.ids =ids;21 }22
23 public ListgetIds() {24 returnids;25 }26 }
接口:
1 package jd.com.vodemo;2 import jd.com.mybaitstest.account;3 import java.util.List;4
5 public interfacevoMapper {6
7 ListfindAccByIdAndName(vodemo vo);8 ListfindAccByIdList(vodemo vo);9 }
mapper类:
1 <?xml version="1.0" encoding="UTF-8" ?>
2 /p>
4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6
7
8
9 NAME LIKE '%${ac.name}%'
10
11
12 And id >#{ac.id}13
14
15
16
17
18 SELECT *FROM t_account19
20
21
22
23 SELECT *FROM t_account24
25
26 #{xx}27
28
29
30
31
32