文章目录
(一)if标签
(二)where标签
(三)foreach标签
(四)sql标签
我们基于之前的案例,只保留4个查询方法

(一)if标签
- 我们设想一个场景:
前端可能传来用户名,让后端查询用户
前端也可能传来用户名、用户地址,让后端查询用户
我们不确定有多少个参数条件,此时可以用动态SQL的if标签解决
IUserDao.java:
/**
* 根据传入的参数条件查询
*
* @param user 查询的条件,有可能有用户名,有可能有性别,有可能有地址……
* 可能全部条件都有,可能一个都没有,可能只有一部分
* @return
*/
List<User> findUserByCondition(User user);
IUserDao.xml:
<!-- 根据条件查询-->
<select id="findUserByCondition" resultType="user" parameterType="user">
select * from user where 1=1
<if test="username != null">
and username = #{username}
</if>
</select>
MyBatisTest.java:
/**
* 测试根据条件查询
*/
@Test
public void testFindByCondition() {
User user = new User();
user.setUsername("老王");
List<User> users = userDao.findUserByCondition(user);
for (User u : users) {
System.out.println(u);
}
}
效果如下:

如果不传参,效果如下:

(二)where标签
如果参数条件很多的话,用if标签就显得很复杂了,如下:

我们可以用where标签优化代码
我们用where标签把我们刚才写的if标签的代码包围起来
可以省略掉where 1=1

(三)foreach标签
我们看看以下这条SQL语句

我们对应在mybatis中的写法:
我们先在QueryVo实体类中添加ids属性

IUserDao.java:
/**
* 根据QueryVo中提供的id集合,查询用户信息
*
* @param vo
* @return
*/
List<User> findUserInIds(QueryVo vo);
IUserDao.xml:
(foreach标签可以跟前面的where标签、if标签混合使用)
<!-- 根据QueryVo中的id集合实现查询用户列表-->
<select id="findUserInIds" resultType="user" parameterType="queryvo">
select * from user
<where>
<if test="ids != null and ids.size()>0">
<foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
#{id}
</foreach>
</if>
</where>
</select>

<foreach>标签用于遍历集合,它的属性如下:
collection:代表要遍历的集合元素
open:代表语句开始的部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符
MyBatisTest.java:
/**
* 测试foreach标签的使用
*/
@Test
public void testFindInIds() {
QueryVo vo = new QueryVo();
List<Integer> list = new ArrayList<Integer>();
list.add(41);
list.add(43);
list.add(45);
vo.setIds(list);
List<User> users = userDao.findUserInIds(vo);
for (User user : users) {
System.out.println(user);
}
}
效果如下:

(四)sql标签
我们可以用sql标签抽取重复的sql语句
<!-- 抽取重复的sql语句-->
<sql id="defaultUser">
select * from user;
</sql>
然后引用即可

注意:如果用这种方法,最好不要在sql语句末尾加分号
否则if之类的标签拼接会失败
其实写不写分号都是可以的,我们以后都不要写分号
本文深入探讨MyBatis框架中的动态SQL应用,包括if、where、foreach和sql标签的使用技巧,通过实例演示如何根据不同的业务需求灵活构建SQL查询语句。
1288

被折叠的 条评论
为什么被折叠?



