Mybatis应用-9种动态标签

388 阅读3分钟

动态SQL官方使用参考

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

if

满足条件再执行<if>标签内容 if标签的test属性满足ognl表达式 在 MyBatis 中常见的 OGNL 表达式如下:

  1. e1 or e2:或关系
  2. e1 and e2:与关系
  3. e1 == e2 或者 e1 eq e2:相等
  4. e1 != e2 或者 e1 neq e2:不等
  5. e1 lt e2 ;e1 < e2;e1 gt e2;e1 > e2;e1 lte e2;e1 <= e2;e1 gte e2;e1 >= e2:比较关系
  6. e1 + e2;e1 – e2;e1 * e2;e1 / e2;e1 % e2:运算关系
  7. !e 或者 not e:非,取反
  8. e.method(args):调用对象方法
  9. e.property:访问属性值
  10. e1[e2]:访问数组、链表(e2 为序号)或者 Map(e2 为键值)

其中 1~4 以及 9~10 都是特别常用的几种情况,而其它的情况不利于 SQL 的维护,因此并不常见。

<select id="ifTest"  resultType="studentDto" >
    select
            id,name,age,hobby
    from student where 1 = 1
    <if test="id != null">
        AND id = #{id}
    </if>
    <if test="name != null">
        AND name = #{name}
    </if>
    <if test="age != null">
        AND age = #{age}
    </if>

</select>

where

where标签可以避免出现多个and的情况。会自动把第一个查询条件的and改成where。多用于查询条件当中

<select id="whereTest"  resultType="studentDto" >
    select
    id,name,age,hobby
    from student
    <where>
    <if test="id != null">
        AND id = #{id}
    </if>
    <if test="name != null">
        AND name = #{name}
    </if>
    <if test="age != null">
        AND age = #{age}
    </if>
    </where>
</select>

choose when otherwise

choose when otherwise是一起使用的等同于jaca的 cswitch case default

<select id="chooseWhenOtherwiseTest"  resultType="studentDto" >
    select
    id,name,age,hobby
    from student
    <where>
        <if test="id != null">
            AND id = #{id}
        </if>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
    <choose>
        <when test="name!=null">
            order by name desc
        </when>
        <otherwise>
            order by age asc
        </otherwise>
    </choose>
</select>

foreach

类似于一次java集合的遍历

属性作用
collection代表传入集合字段
item每次遍历的别名
openforeach操作开始时的前缀
separator每次遍历后元素之间的分隔符
close遍历完成后的后缀
index每次遍历的下标别名
<select id="foreachTest" resultType="studentDto" >
    select
            id,name,age,hobby
    from student
    <where>
        <if test="ids != null">
            AND id in
            <foreach collection="ids" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
    <choose>
        <when test="name!=null">
            order by name desc
        </when>
        <otherwise>
            order by age asc
        </otherwise>
    </choose>
</select>

bind

将一个传递进来的值绑定到新的值上面。比如模糊查询

<select id="bindTest" resultType="org.apache.ibatis.mytest.StudentDto">
    select
    id,name,age,hobby
    from student
    <where>
        <if test="ids != null">
            AND id in
            <foreach collection="ids" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        <if test="name != null">
            <bind name="likeName" value="'%'+name+'%'" ></bind>
                  AND name like #{likeName}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
    <choose>
        <when test="name!=null">
            order by name desc
        </when>
        <otherwise>
            order by age asc
        </otherwise>
    </choose>

set

set标签多用于修改操作 在表名后加上set 并且去掉多余的, 比如age = #{age}, 这里的,

<update id="setTest" >
    update student
    <set>
        <if test="id != null">
             id = #{id},
        </if>
        <if test="name != null">
             name = #{name},
        </if>
        <if test="age != null">
             age = #{age},
        </if>
    </set>
</update>

trim

mybatis的trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。

属性描述
prefix给sql语句拼接的前缀
suffix给sql语句拼接的后缀
prefixOverrides去除sql语句前面的关键字或者字符,该关键字或者字符由prefixOverrides属性指定
suffixOverrides去除sql语句后面的关键字或者字符,该关键字或者字符由suffixOverrides属性指定
<insert id="trimTest" >
    <trim prefix="insert into student(" suffix=")" suffixOverrides=",">
        <if test="id != null">
            id,
        </if>
        <if test="name != null">
            name,
        </if>
        <if test="age != null">
            age,
        </if>
    </trim>
    <trim prefix=" values(" suffix=")" suffixOverrides=",">
        <if test="id != null">
            #{id},
        </if>
        <if test="name != null">
            #{name},
        </if>
        <if test="age != null">
            #{age},
        </if>
    </trim>
</insert>