【MyBatis】进一步理解choose、when、otherwise标签

2023-11-16

choose、when、otherwise

choose里面包含when、otherwise两个标签,choose是父标签,when和otherwise必须都要写在它里面

当 when 中有条件满足的时候,就会跳出 choose,即所有的 when 和 otherwise 条件中,只有一个会输出

当所有的条件都不满足的时候就输出 otherwise 中的内容。第一个when不满足则继续往下判断,直到满足为止,如果全不满足,则执行otherwise(相当于else)

when

  • 相当于else if,至少有一个
  • 当 when 中的条件满足的时候就输出其中的内容
  • 和java 中的 switch 中的case效果差不多,但是和case还是有差别的(这里是直到寻找到满足条件的值为止or全不满足)
  • 当第一个条件满足时,下面的都会执行

otherwise

when元素表示当 when 中的条件满足的时候就输出其中的内容,

  • 相当于else,最多有一个
  • 当所有的我很条件都不满足的时候就输出 otherwise 中的内容(可以不写)

  • 不需要加and,第一个条件满足下面都不用判断了

  • 这里员工姓名成立的话,其它下面所有条件都不再判断了

用代码带你进一步理解

表结构:

映射文件:

主要看这里面的choose中的语句 

我把empName放在了choose开头

<!--List<Emp> getEmpByChoose(Emp emp);-->
<select id="getEmpByChoose" resultType="Emp">
    select *from t_emp
    <where>
        <choose>
            <when test="empName!= '' and empName!= null">
                emp_name=#{empName}
            </when>
            <when test="age != '' and age != null">
                age = #{age}
            </when>
            <when test="gender != '' and gender != null">
                gender = #{gender}
            </when>
        </choose>
    </where>
</select>

测试类

这里把张三放到了前面,我们可以看到数据库表中是有张三这条数据的,所以第一个when满足,直接就输出结果(下面的不再判断)

@Test
public void testGetEmpByChoose(){
    SqlSession sqlSession= SqlSessionUtil.getSqlSession();
    DynamicSQLMapper mapper=sqlSession.getMapper(DynamicSQLMapper.class);
    Emp emp=new Emp(null,"张三",20,"男");
    List<Emp> list=mapper.getEmpByChoose(emp);
    list.forEach(System.out::println);
}

结果如下:

DEBUG 12-27 22:35:57,043==> Parameters: 张三(String) (BaseJdbcLogger.java:137) 
DEBUG 12-27 22:35:57,057<==      Total: 1 (BaseJdbcLogger.java:137) 
Emp{empId=1, empName='张三', age=20, gender='男'}

这里我把性别gender改为不男不女,效果还是一样,足以证明我们的后面语句没有判断

把empName改为" ",gender和上面一样不符合要求,但是age 满足要求,一样可以查询到相应信息

当全部内容都不满足条件时,必然emp不会输出

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MyBatis】进一步理解choose、when、otherwise标签 的相关文章

随机推荐