Mybatis的动态SQL语句

项目目录

在这里插入图片描述

动态 SQL 之if标签

持久层 Dao 接口

1
2
3
4
5
6
/**
* 根据传入的参数条件
* @param user 查询的条件,有可能有用户名 ,性别,或都没有
* @return
*/
List<User> finduserCondition(User user);

持久层 Dao 映射配置

1
2
3
4
5
6
7
8
9
10
<!--根据条件查询-->
<select id="finduserCondition" resultMap="userMap" parameterType="user">
select * from user where 1=1
<if test="userName != null">
and username = #{userName}
</if>
<if test="userSex != null">
and sex = #{userSex}
</if>
</select>

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 根据条件查询 if标签
* @throws Exception
*/
@Test
public void testfinduserCondition() throws Exception {

User u = new User();
u.setUserName("老王");
u.setUserSex("男");
//5.使用代理对象执行方法
List<User> users = userDao.finduserCondition(u);
for (User user : users) {
System.out.println(user);
}

}

==测试结果:==
在这里插入图片描述

动态 SQL 之where标签

为了简化上面 where 1=1 的条件拼装,我们可以采用<where>标签来简化开发。

持久层 Dao 映射配置

1
2
3
4
5
6
7
8
9
10
11
<select id="finduserCondition" resultMap="userMap" parameterType="user">
select * from user
<where>
<if test="userName != null">
and username = #{userName}
</if>
<if test="userSex != null">
and sex = #{userSex}
</if>
</where>
</select>

效果和上面的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 中加入一个 List 集合用于封装参数

==QueryVo:==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.keafmd.domain;

import java.util.List;

/**
* Keafmd
*
* @ClassName: QueryVo
* @Description:
* @author: 牛哄哄的柯南
* @date: 2021-02-08 21:08
*/
public class QueryVo {
private User user;
private List<Integer> ids;

public List<Integer> getIds() {
return ids;
}

public void setIds(List<Integer> ids) {
this.ids = ids;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}

持久层 Dao 接口

1
2
3
4
5
6
/**
* 根据QueryVo中提供的id集合查询
* @param vo
* @return
*/
List<User> findUserInIds(QueryVo vo);

持久层 Dao 映射配置

1
2
3
4
5
6
7
8
9
10
11
12
<!--根据QueryVo中的id集合实现查询查询用户列表-->
<select id="findUserInIds" resultMap="userMap" parameterType="queryvo">
<include refid="defaultUser"></include>
<where>
<if test="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
13
14
15
16
17
@Test
public void testfindUserInIds() throws Exception {

QueryVo vo = new QueryVo();
List<Integer> list = new ArrayList<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);
}

}

==测试结果:==
在这里插入图片描述

Mybatis中简化编写的 SQL 片段

Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。
这样可以简化我们每次都需要在sql语句中写的select * from user

定义代码片段

1
2
3
4
<!--了解的内容,抽取重复的sql语句-->
<sql id="defaultUser">
select * from user
</sql>

==注意细节==:在抽取重复的sql语句尽量不要写分号;,因为可能还会和后面的sql语句进行拼接,有分号就会导致报错。

引用代码片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--配置查询所有-->
<select id="findAll" resultMap="userMap">
<include refid="defaultUser"></include>
</select>

<!--根据QueryVo中的id集合实现查询查询用户列表-->
<select id="findUserInIds" resultMap="userMap" parameterType="queryvo">
<include refid="defaultUser"></include>
<where>
<if test="ids!=null and ids.size()>0">
<foreach collection="ids" open = "and id in (" close=")" item="uid" separator=",">
#{uid}
</foreach>

</if>
</where>
</select>

以上就是Mybatis的动态SQL语句的全部内容。

看完如果对你有帮助,感谢支持!
在这里插入图片描述

加油!

共同努力!

Keafmd