学科分类
目录
SSM框架

<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>元素的使用。

点击此处
隐藏目录