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不会输出