choose标签的作用:
按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
假设有一个user表,里面有username和sex字段,那么查询user的时候我可以按username来查找,也可以按sex来查找,对应的sql可以这样写:
select * from user where username = 'xx'
或者
select * from user where sex= 'xx'
也就是说对于多个条件只要有一个条件满足即可,这种情况只能使用choose 标签了;用if标签的话是实现不了的,因为if标签只要条件满足就会执行,但是我们并不想应用所有的条件,而只是想从多个选项中选择一个,choose标签就可以解决这个问题。
对应的mapper文件可以这样写:
<select id="findUserByNameOrSex" parameterType="blog.csdn.net.mchenys.pojo.User"
resultType="blog.csdn.net.mchenys.pojo.User">
select * from user
<where>
<choose>
<when test="username !=null and username !=''">
username = #{username}
</when>
<when test="sex !=null and sex !=''">
sex = #{sex}
</when>
<otherwise></otherwise>
</choose>
</where>
</select>
假设测试方法是这样的
@Test
public void testFindUserByNameOrSex() {
UserMapper userMapper = (UserMapper)applicatonContext.getBean("userMapper");
User user = new User();
user.setUsername("老陈");
user.setSex("1");
List<User> list = userMapper.findUserByNameOrSex(user);
System.out.println(list);
}
执行后,查看控制台的sql语句,你会发现只输出了一个条件
虽然代码中是同时设置了username和sex这2个条件,但是由于when 标签先判断的是username,刚好也满足条件,所以就只按username来查询了。