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

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

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,第一个条件满足下面都不用判断了


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


用代码带你进一步理解

表结构:


b2c30f15c919413f980b588162c0e3ff.png


映射文件:


主要看这里面的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改为不男不女,效果还是一样,足以证明我们的后面语句没有判断


94e64e7b7bfc44269e3f9de052706e65.png


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


dc9136a5e28b430abe1a9b84593b968f.png


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

10f847360961438bbe9bb0d9cb926d10.png


相关文章
|
30天前
|
SQL XML Java
Mybatis中选择语句的使用:<choose>标签、分区排序 Row_num() over ()函数的使用呢
Mybatis中选择语句的使用:<choose>标签、分区排序 Row_num() over ()函数的使用呢
15 0
|
4月前
|
SQL Java 数据库连接
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
93 0
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
|
1月前
|
SQL Java 关系型数据库
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
18 0
|
1月前
|
SQL Java 关系型数据库
MyBatis中的9种常用动态sql标签精妙用法
MyBatis中的9种常用动态sql标签精妙用法
69 0
|
3月前
|
SQL Java 数据库连接
一文彻底搞懂Mybatis系列(九)之Mybatis动态SQL标签总结
一文彻底搞懂Mybatis系列(九)之Mybatis动态SQL标签总结
110 0
|
4月前
|
XML SQL Java
今日记录:学习一个Mybatis的技能之choose 和 bind
今日记录:学习一个Mybatis的技能之choose 和 bind
26 1
|
4月前
|
SQL 存储 Java
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
36 0
|
4月前
|
SQL XML Java
掌握MyBatis动态SQL:从标签到实战的全面解析
掌握MyBatis动态SQL:从标签到实战的全面解析
274 0
|
5月前
|
SQL Java 数据库连接
Mybatis使用collection标签实现一对多关联查询,返回结果集list中嵌套list
Mybatis使用collection标签实现一对多关联查询,返回结果集list中嵌套list
150 0
|
1月前
|
SQL Java 数据库连接
挺详细的spring+springmvc+mybatis配置整合|含源代码
挺详细的spring+springmvc+mybatis配置整合|含源代码
42 1