<!--根据条件查询--><selectid="finduserCondition"resultMap="userMap"parameterType="user">
select * from user where 1=1
<iftest="userName != null">
and username = #{userName}
</if><iftest="userSex != null">
and sex = #{userSex}
</if></select>
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
测试代码
/**
* 根据条件查询 if标签
* @throws Exception
*/@TestpublicvoidtestfinduserCondition()throws Exception {
User u =newUser();
u.setUserName("老王");
u.setUserSex("男");//5.使用代理对象执行方法
List<User> users = userDao.finduserCondition(u);for(User user : users){
System.out.println(user);}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
测试结果:
动态 SQL 之where标签
为了简化上面 where 1=1 的条件拼装,我们可以采用
<where>
标签来简化开发。
持久层 Dao 映射配置
<selectid="finduserCondition"resultMap="userMap"parameterType="user">
select * from user
<where><iftest="userName != null">
and username = #{userName}
</if><iftest="userSex != null">
and sex = #{userSex}
</if></where></select>
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
效果和上面的if标签一样
动态 SQL 之foreach标签
需求
传入多个 id 查询用户信息,用下边两个 sql 实现:
SELECT * FROM USERS WHERE username LIKE ‘%王%’ AND (id =10 OR id =19 OR id=36)
SELECT * FROM USERS WHERE username LIKE ‘%王%’ AND id IN (10,19,36)
这样我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。
<!--根据QueryVo中的id集合实现查询查询用户列表--><selectid="findUserInIds"resultMap="userMap"parameterType="queryvo"><includerefid="defaultUser"></include><where><iftest="ids!=null and ids.size()>0">
<foreach collection="ids" open = "and id in (" close=")" item="uid" separator=",">
#{uid}
</foreach></if></where></select>
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
测试代码
@TestpublicvoidtestfindUserInIds()throws Exception {
QueryVo vo =newQueryVo();
List<Integer> list =newArrayList<Integer>();
list.add(41);
list.add(42);
list.add(50);
vo.setIds(list);//5.使用代理对象执行方法
List<User> users = userDao.findUserInIds(vo);for(User user : users){
System.out.println(user);}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
测试结果:
Mybatis中简化编写的 SQL 片段
Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。
这样可以简化我们每次都需要在sql语句中写的
select * from user
。
定义代码片段
<!--了解的内容,抽取重复的sql语句--><sqlid="defaultUser">
select * from user
</sql>
<!--配置查询所有--><selectid="findAll"resultMap="userMap"><includerefid="defaultUser"></include></select><!--根据QueryVo中的id集合实现查询查询用户列表--><selectid="findUserInIds"resultMap="userMap"parameterType="queryvo"><includerefid="defaultUser"></include><where><iftest="ids!=null and ids.size()>0">
<foreach collection="ids" open = "and id in (" close=")" item="uid" separator=",">
#{uid}
</foreach></if></where></select>