Mybatis 的第三个强大特性便是它的动态SQL, 允许根据传入参数不同, 动态拼接sql. Mybatis 动态sql 功能很强大, 但是标签却很少, 这主要得益于Mybatis 动态表达式使用了Apache 的OGNL 表达式.
1. 动态sql相关标签
Mybatis 的动态sql 功能很强大, 但是标签却比较少. 大致可以分为以下四类:
- 判断类标签: if, choose, when, otherwise
- 拼接截断类标签: trime, where, set
- 循环类标签: foreach
- 自定义遍历标签: bind
2. 判断类标签
2.1 if
- test 属性的表达式写法就是ognl 表达式写法
- 当test 表达式为真时, 拼接sql
- Mybatis 并没有提供else 标签, 若要实现else 功能, 可以通过test表达式取反, 或choose标签来实现
- 此处where, 只是演示不借助于标签不优雅写法, 并不推荐使用
<!-- 通过性别查询员工列表, 如果传入sex为空, 则默认查询性别为M 的员工 -->
<select id="queryBySex" resultType="EmployeePO">
select * from t_employee
where
<!-- 默认查询sex=M -->
<if test="sex=null or sex=''">
sex = 'M'
</if>
<if test="sex!=null and sex!=''" >
sex = #{sex}
</if>
</select>
2.2 choose(when, otherwise)
- choose-when 标签是多条件选择标签, 类似于java 中的switch case 结构.
- choose-otherwise 标签也可以实现if-else 结构
2.2.1 choose 实现if-else 接口
- 如果传入sex为空, 则查询sex=M的, 否则查询sex=W 的员工列表
- 此处where 1=1 , 只是演示不借助于标签不优雅写法, 并不推荐使用
<!-- 通过性别查询员工列表, 如果传入sex为空, 则默认查询性别为M 的员工 -->
<select id="queryBySex" resultType="EmployeePO">
select * from t_employee
where 1=1
<choose>
<when test="sex=null or sex=''">
and sex = 'M'
</when>