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

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

用代码带你进一步理解

表结构:

映射文件:

主要看这里面的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不会输出

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

即兴小索奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值