这里介绍的if, where, sql标签都是使用在mybatis映射文件中的。看本篇文章前建议先看前面的文章。
if标签
用在<select>标签或者<where>标签内,作用是用来判传入参数的。
例如使用 where 1=1和if标签动态拼接多条件查询:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="blog.youkuaiyun.com.mchenys.mapper.UserMapper">
<!-- 多条件查询 -->
<select id="findUserByNameAndSex" parameterType="blog.youkuaiyun.com.mchenys.poj.User"
resultType="blog.youkuaiyun.com.mchenys.poj.User">
<!-- 方式一:使用 where 1=1和if标签动态拼接多条件查询-->
select * from user where 1=1
<if test="username !=null and username !=''">
and username like '%${username}%'
</if>
<if test="sex !=0">
and sex = #{sex}
</if>
</select>
</mapper>
对应的UserMapper接口需要添加名称为findUserByNameAndSex的方法
//多条件查询
public List<User> findUserByNameAndSex(User user);
测试类:
// 多条件拼接查询
@Test
public void testFindUserByNameAndSex() throws Exception {
SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User();
user.setUsername("王");
user.setSex(1);
List<User> list = mapper.findUserByNameAndSex(user);
System.out.println(list);
}
执行结果:

修改测试类的testFindUserByNameAndSex方法,注释掉user.setSex(1); 这句后,再运行观察控制台log的sql语句

发现,sql语句会自动减少一个sex这个查询条件,说明if标签起作用了,只有符合条件的输入参数才会自动拼接到sql语句中。
如果将user.setUsername("王");这句也注释调的话,再次运行, sql语句就变成了这样.

结果也是符合预期的,没有符合条件的输入参数,自然就不会拼接到sql语句中了。
where标签
where标签的作用有2个:
- 自动向sql语句中添加where关键字
- 自动去掉第一个条件的and关键字
where标签通常和if标签结合来用,像这样
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="blog.youkuaiyun.com.mchenys.mapper.UserMapper">
<!-- 多条件查询 -->
<select id="findUserByNameAndSex" parameterType="blog.youkuaiyun.com.mchenys.poj.User"
resultType="blog.youkuaiyun.com.mchenys.poj.User">
<!-- 方式二:使用where标签+if标签动态拼接多条件查询 -->
select * from user
<where>
<if test="username !=null and username !=''">
and username like '%${username}%'
</if>
<if test="sex !=0">
and sex = #{sex}
</if>
</where>
</select>
</mapper>
再次运行testFindUserByNameAndSex测试方法,同时将查询条件都放出来,查看控制台log的sql语句

注释掉user.setSex(1)后执行的语句为:

再把user.setUsername("王")条件也注释掉后执行的语句为:

看来还是很完美的。
sql和include标签
sql标签用在mapper标签内,用于封装sql语句,达到重用的目的。
include标签用在select、insert、update、delete标签内,用于引入sql标签内定义的sql语句。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="blog.youkuaiyun.com.mchenys.mapper.UserMapper">
<!-- 封装sql条件查询语句,封装后可以重用
id: 条件语句的唯一标识,作为外部调用的唯一入口
-->
<sql id="user_Where">
<where>
<if test="username !=null and username !=''">
and username like '%${username}%'
</if>
<if test="sex !=0">
and sex = #{sex}
</if>
</where>
</sql>
<!-- 多条件查询 -->
<select id="findUserByNameAndSex" parameterType="blog.youkuaiyun.com.mchenys.poj.User"
resultType="blog.youkuaiyun.com.mchenys.poj.User">
<!-- 方式三:引入条件查询语句 -->
select * from user
<include refid="user_Where"></include>
</select>
</mapper>
执行效果和上面的where标签示例其实是一样的,只不过是查询条件是通过include标签引入的。
本文深入解析MyBatis框架中if、where、sql及include标签的使用技巧,通过实例展示如何实现动态SQL拼接,提升数据库操作灵活性。
2224

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



