三、动态SQL
动态sql
mybatis的动态sql是基于ognl表达式的,它可以帮助我们方便的在sql语句中实现某些逻辑。
动态sql的元素
元素 | 作用 | 备注 |
---|---|---|
if | 判断语句 | 单条件分支判断 |
choose、when、otherwise | 相当于java中的switch case when语句 | 多条件分支判断 |
trim、where、set | 辅助元素 | 用于处理一些sql拼装问题 |
foreach | 循环语句 | 在in语句等列举条件常用 |
if
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>
choose、when、otherwise
有些时候我们还需要多种条件的选择,在java中我们可以使用switch、case、default语句,而在映射器的动态语句中可以使用choose、when、otherwise元素。
<!-- 有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>
where
上面的select语句我们加了一个1=1的绝对true的语句,目的是为了防止语句错误,变成select * from student where这样where后没有内容的错误语句。这样会有点奇怪,此时可以使用
有时候我们要去掉一些特殊的sql语法,比如常见的and、or,此时可以使用trim元素。trim元素意味着我们需要去掉一些特殊的字符串,prefix代表的是语句的前缀,而prefixoverrides代表的是你需要去掉的那种字符串,suffix表示语句的后缀,suffixoverrides代表去掉的后缀字符串。 foreach元素是一个循环语句,它的作用是遍历集合,可以支持数组、list、set接口。<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>
trim
<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
<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>
下一篇: 爱会超越性别吗?