MyBatis的动态SQL是基于OGNL表达式的,它能够帮助咱们方便的在SQL语句中实现某些逻辑。sql
元素 | 做用 | 备注 |
---|---|---|
if | 判断语句 | 单条件分支判断 |
choose、when、otherwise | 至关于Java中的switch case when语句 | 多条件分支判断 |
trim、where、set | 辅助元素 | 用于处理一些SQL拼装问题 |
foreach | 循环语句 | 在in语句等列举条件经常使用 |
if元素至关于Java中的if语句,它经常与test属性联合使用。如今咱们要根据name去查找学生,可是name是可选的,以下所示:数组
<select id="selectByName" resultType="com.zl.domain.StudentDomain"> SELECT * FROM student WHERE 1=1 <if test="name != null and name != ''"> AND name LIKE concat('%', #{name}, '%') </if> </select>
有些时候咱们还须要多种条件的选择,在Java中咱们能够使用switch、case、default语句,而在映射器的动态语句中能够使用choose、when、otherwise元素。dom
<!-- 有name的时候使用name搜索,没有的时候使用id搜索 --> <select id="select" resultType="com.zl.domain.StudentDomain"> SELECT * FROM student WHERE 1=1 <choose> <when test="name != null and name != ''"> AND name LIKE concat('%', #{name}, '%') </when> <when test="id != null"> AND id = #{id} </when> </choose> </select>
上面的select语句咱们加了一个1=1的绝对true的语句,目的是为了防止语句错误,变成SELECT * FROM student WHERE这样where后没有内容的错误语句。这样会有点奇怪,此时能够使用
<select id="select" resultType="com.zl.domain.StudentDomain"> SELECT * FROM student <where> <if test="name != null and name != ''"> name LIKE concat('%', #{name}, '%') </if> </where> </select>
有时候咱们要去掉一些特殊的SQL语法,好比常见的and、or,此时能够使用trim元素。trim元素意味着咱们须要去掉一些特殊的字符串,prefix表明的是语句的前缀,而prefixOverrides表明的是你须要去掉的那种字符串,suffix表示语句的后缀,suffixOverrides表明去掉的后缀字符串。code
<select id="select" resultType="com.zl.domain.StudentDomain"> SELECT * FROM student <trim prefix="WHERE" prefixOverrides="AND"> <if test="name != null and name != ''"> AND name LIKE concat('%', #{name}, '%') </if> <if test="id != null"> AND id = #{id} </if> </trim> </select>
foreach元素是一个循环语句,它的做用是遍历集合,能够支持数组、List、Set接口。xml
<select id="select" resultType="com.zl.domain.StudentDomain"> SELECT * FROM student WHERE name IN <foreach collection="names" open="(" close=")" separator="," item="item"> #{item} </foreach> </select>