Mybaits动态SQL之choose标签和子标签when,otherwise
choose也是根据条件判断生成sql,如果前面的条件成立,后面的所有条件忽略。与if标签相反。
写一个含choose标签动态sql
条件查询 user
- 首先判断名字是否为空,根据名字来判断
- 根据年龄来判断
- 前面两个都为空,查询所有,根据id倒序排序。
<!--
首先判断name是否为空 如果不为空根据name查询 结束
如果name为空 判断age是否传达, 不为空大于0 根据age查询
否则根据id倒序
-->
<select id="query2" resultType="user" parameterType="user">
select
*
from
t_user
where 1=1
<choose>
<when test="name != null">
and name = #{name}
</when>
<when test="age!= null and age > 0">
and age = #{age}
</when>
<otherwise>
order by id desc
</otherwise>
</choose>
</select>
测试一下,根据根据id倒序排序
@Test
public void test3() throws IOException {
InputStream in = Resources.getResourceAsStream("mybatis-cfg.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession(true);
// 获取代理类
UserMapper dao = session.getMapper(UserMapper.class);
User user = new User();
//user.setName("李四");
//user.setAge(22);
List<User> list = dao.query2(user);
for (User user2 : list) {
System.out.println(user2);
}
session.close();
}
打印结果粘贴
[QC] DEBUG [main] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(159) | ==> Preparing: select * from t_user where 1=1 order by id desc
[QC] DEBUG [main] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(159) | ==> Parameters:
[QC] DEBUG [main] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(159) | <== Total: 15
User [id=51, name=zhangsan2, age=27]
User [id=50, name=zhangsan1, age=26]
User [id=49, name=zhangsan, age=25]
User [id=48, name=uw, age=22]
User [id=47, name=zhangsan2, age=27]
User [id=46, name=zhangsan1, age=26]
User [id=45, name=zhangsan, age=25]
User [id=44, name=uw, age=22]
User [id=43, name=zhangsan2, age=27]
User [id=42, name=zhangsan1, age=26]
User [id=41, name=zhangsan, age=25]
User [id=40, name=cjw, age=18]
User [id=39, name=cjw, age=18]
User [id=37, name=cjw, age=18]
User [id=1, name=猴子, age=18]
总结:
项目打包 提取码:3v4k
环境:eclipse,maven