欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

三、动态SQL

程序员文章站 2023-10-16 13:13:50
动态SQL MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 动态SQL的元素 | 元素 | 作用 | 备注 | | | | | | if | 判断语句 | 单条件分支判断 | | choose、when、otherwise | 相当于Java中的s ......

动态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后没有内容的错误语句。这样会有点奇怪,此时可以使用元素。

<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

有时候我们要去掉一些特殊的sql语法,比如常见的and、or,此时可以使用trim元素。trim元素意味着我们需要去掉一些特殊的字符串,prefix代表的是语句的前缀,而prefixoverrides代表的是你需要去掉的那种字符串,suffix表示语句的后缀,suffixoverrides代表去掉的后缀字符串。

<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

foreach元素是一个循环语句,它的作用是遍历集合,可以支持数组、list、set接口。

    <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>
  • collection配置的是传递进来的参数名称
  • item配置的是循环中当前的元素。
  • index配置的是当前元素在集合的位置下标。
  • open和 close配置的是以什么符号将这些集合元素包装起来。
  • separator是各个元素的间隔符。