<if>元素
在MyBatis中,<if>元素是最常用的判断语句,它类似于Java中的if语句,主要用于实现某些简单的条件选择。
在实际应用中,我们可能会通过多个条件来精确的查询某个数据。例如,要查找某个客户的信息,可以通过姓名和职业来查找客户,也可以不填写职业直接通过姓名来查找客户,还可以都不填写而查询出所有客户,此时姓名和职业就是非必须条件。类似于这种情况,在MyBatis中就可以通过<if>元素来实现。下面就通过一个具体的案例,来演示这种情况下<if>元素的使用,具体实现步骤如下。
(1)在Eclipse中,创建一个名为chapter08的Web项目,将第6章MyBatis入门程序中的JAR包和文件复制到chapter08中,并将配置文件中的数据库信息修改为外部引入的形式,同时创建一个com.itheima.utils包,在该包下引入第7章编写的工具类MybatisUtils,这样就完成了项目的创建和基本配置。搭建后的项目文件结构如图1所示。
图1 chapter08项目文件结构
(2)修改映射文件CustomerMapper.xml,在映射文件中使用<if>元素编写根据客户姓名和职业组合条件查询客户信息列表的动态SQL,如文件1所示。
文件1 CustomerMapper.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
4 <mapper namespace="com.itheima.mapper.CustomerMapper">
5 <!-- <if>元素使用 -->
6 <select id="findCustomerByNameAndJobs"
7 parameterType="com.itheima.po.Customer"
8 resultType="com.itheima.po.Customer">
9 select * from t_customer where 1=1
10 <if test="username !=null and username !=''">
11 and username like concat('%',#{username}, '%')
12 </if>
13 <if test="jobs !=null and jobs !=''">
14 and jobs= #{jobs}
15 </if>
16 </select>
17 </mapper>
在文件1中,使用<if>元素的test属性分别对username和jobs进行了非空判断(test属性多用于条件判断语句中,用于判断真假,大部分的场景中都是进行非空判断,有时候也需要判断字符串、数字和枚举等),如果传入的查询条件非空就进行动态SQL组装。
(3)在测试类MybatisTest中,编写测试方法findCustomerByNameAndJobsTest(),如文件22所示。
文件2 MybatisTest.java
1 package com.itheima.test;
2 import java.util.List;
3 import org.apache.ibatis.session.SqlSession;
4 import org.junit.Test;
5 import com.itheima.po.Customer;
6 import com.itheima.utils.MybatisUtils;
7 public class MybatisTest {
8 /**
9 * 根据客户姓名和职业组合条件查询客户信息列表
10 */
11 @Test
12 public void findCustomerByNameAndJobsTest(){
13 // 通过工具类生成SqlSession对象
14 SqlSession session = MybatisUtils.getSession();
15 // 创建Customer对象,封装需要组合查询的条件
16 Customer customer = new Customer();
17 customer.setUsername("jack");
18 customer.setJobs("teacher");
19 // 执行SqlSession的查询方法,返回结果集
20 List<Customer> customers = session.selectList("com.itheima.mapper"
21 + ".CustomerMapper.findCustomerByNameAndJobs",customer);
22 // 输出查询结果信息
23 for (Customer customer2 : customers) {
24 // 打印输出结果
25 System.out.println(customer2);
26 }
27 // 关闭SqlSession
28 session.close();
29 }
30 }
在文件2的findCustomerByNameAndJobsTest()方法中,首先通过MybatisUtils工具类获取了SqlSession对象,然后使用Customer对象封装了用户名为jack且职业为teacher的查询条件,并通过SqlSession对象的selectList()方法执行多条件组合的查询操作。为了查看查询结果,这里使用了输出语句输出查询结果信息。最后程序执行完毕时,关闭了SqlSession对象。
使用JUnit4执行findCustomerByNameAndJobsTest()方法后,控制台的输出结果如图2所示。
图2 运行结果
从图2可以看出,已经查询出了username为jack,并且jobs为teacher的客户信息。如果将封装到Customer对象中的jack和teacher两行代码注释(即传入的客户姓名和职业都为空),然后再次使用JUnit4执行findCustomerByNameAndJobsTest()方法后,控制台的输出结果如图3所示。
图3 运行结果
从图3可以看到,当未传递任何参数时,程序会将数据表中的所有数据查出。这就是<if>元素的使用。