三、Mybatis多条件查询之if, where, sql, include标签的使用

这里介绍的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.csdn.net.mchenys.mapper.UserMapper">

	<!-- 多条件查询 -->
	<select id="findUserByNameAndSex" parameterType="blog.csdn.net.mchenys.poj.User"
		resultType="blog.csdn.net.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个:

  1. 自动向sql语句中添加where关键字
  2. 自动去掉第一个条件的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.csdn.net.mchenys.mapper.UserMapper">

	<!-- 多条件查询 -->
	<select id="findUserByNameAndSex" parameterType="blog.csdn.net.mchenys.poj.User"
		resultType="blog.csdn.net.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.csdn.net.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.csdn.net.mchenys.poj.User"
		resultType="blog.csdn.net.mchenys.poj.User">
		
		<!-- 方式三:引入条件查询语句  -->
		
		select * from user 
		
		<include refid="user_Where"></include> 
		
	</select>

</mapper>

执行效果和上面的where标签示例其实是一样的,只不过是查询条件是通过include标签引入的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mybatis的<include>标签用于在SQL映射文件引用其他的SQL片段. 可以让我们把常用的SQL片段抽取出来,避免重复编写。使用方式如下: 在映射文件定义SQL片段: ``` <sql id="columns">id, name, age</sql> ``` 在其他SQL使用: ``` <select id="selectAll" resultType="com.example.MyClass"> SELECT <include refid="columns"/> FROM my_table </select> ``` 标签属性refid对应的值是定义SQL片段时使用的id, 上面的例子columns为 refid值. ### 回答2: MyBatis的<include>标签可以在XML映射文件实现代码重用和片段复用。通过该标签,可以将一个或多个相同的SQL片段提取出来,然后在不同的地方进行引用,从而减少代码的冗余和重复编写。 <include>标签使用主要包括以下几个步骤: 1. 首先,需要将要重用的SQL片段抽取出来,可以将其定义在XML映射文件的任何位置。 2. 在需要引用该SQL片段的位置,使用<include>标签进行引用。语法格式为:<include refid="sql片段的id"/>。其,refid属性用于指定被引用的SQL片段的id。 3. 引用的SQL片段可以定义在同一个XML映射文件,也可以定义在其他XML映射文件。如果在其他XML文件定义了SQL片段,则需要在引用的地方使用命名空间进行引用。例如:<include refid="命名空间.sql片段的id"/>。 4. <include>标签还可以与<where>标签等结合使用,实现动态的SQL拼接,使SQL语句更加灵活和可读。 总的来说,<include>标签MyBatis一个非常有用的标签,它能够提高代码的复用性和可读性,减少代码的冗余。通过将常用的SQL片段抽取出来,可以让SQL语句更加清晰和简洁。同时,<include>标签还可以与其他标签结合使用,实现更加灵活和动态的SQL拼接。 ### 回答3: MyBatis是一种开源的持久化框架,可以简化Java应用程序与关系型数据库之间的交互。在MyBatis,<include>标签用于重用SQL语句片段。 <include>标签可以将已经定义好的SQL片段(即SQL语句的一部分)包含在其他SQL语句,以达到复用的目的。这在需要多次使用相同的SQL语句片段时非常有用,可以减少代码冗余和维护成本。 使用<include>标签的步骤如下: 1. 定义SQL语句片段:在MyBatis的mapper文件,可以使用<sql>标签或者<include>标签定义SQL语句的片段,例如: ```xml <sql id="selectFields"> id, name, age </sql> ``` 2. 在其他SQL语句引用SQL片段:使用<include>标签,将已经定义好的SQL片段引用到其他SQL语句,例如: ```xml <select id="getUser" resultType="User"> SELECT <include refid="selectFields"/> FROM user WHERE id = #{id} </select> ``` 在这个例子,<include>标签用于引用了之前定义好的SQL片段"selectFields",从而实现了<include>标签的复用效果。 总结来说,<include>标签可以在MyBatis实现SQL语句片段的复用,提高了代码的可维护性和重用性。它可以结合其他标签一起使用,如<sql>标签来定义SQL片段,从而进一步提高SQL语句的可读性和简洁性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值