在使用< if>元素时,只要test属性中的表达式为true,就会执行元素中的条件语句,但是在实际应用中,有时只需要从多个选项中选择一个去执行。
例如下面的场景:
“当客户名称不为空,则只根据客户名称进行客户筛选;
当客户名称为空,而客户职业不为空,则只根据客户职业进行客户筛选。
当客户名称和客户职业都为空,则要求查询出所有电话不为空的客户信息。”
此种情况下,使用< if>元素进行处理是非常不合适的。如果使用的是 Java 语言,这种情况显然更适合使用switch…case…default语句来处理。那么在MyBatis中有没有类似的语句呢?答案是肯定的。针对上面情况,MyBatis中可以使用< choose>、< when>、< otherwise>元素进行处理。
映射文件代码
<select id="findCustomerByNameOrJobs" parameterType="com.po.Customer" resultType="com.po.Customer"> select * from t_customer where 1=1 <choose> <when test="username!=null and username!=''"> and username like concat('%',#sername, '%') </when> <when test="jobs!=null and jobs!=''"> and jobs= #{jobs} </when> <otherwise> and phone is not null </otherwise> </choose> </select>
测试方法
/** * 根据客户姓名或职业查询客户信息列表 */ @Test public void findCustomerByNameOrJobsTest() { // 通过工具类生成SqlSession对象 SqlSession session = MybatisUtils.getSession(); // 创建Customer对象,封装需要组合查询的条件 Customer customer = new Customer(); customer.setUsername("jack"); customer.setJobs("teacher"); // 执行SqlSession的查询方法,返回结果集 List<Customer> customers = session.selectList("com.itheima.mapper" + ".CustomerMapper.findCustomerByNameOrJobs", customer); // 输出查询结果信息 for (Customer customer2 : customers) { // 打印输出结果 System.out.println(customer2); } // 关闭SqlSession session.close(); }
运行结果: