Loading

MyBatis笔记 二 动态SQL

动态SQL

if

和test属性连用,用于进行判断,如果test中的el为真,那么if中的部分就会拼接到SQL中

<select id="getStudentByName" parameterType="string" resultMap="studentMap">
    SELECT * FROM student
    <if test="name!=null and name!=''">
        WHERE name like concat('%', #{name}, '%')
    </if>
</select>

有个小坑,如果想用if识别参数名,要加上@Param注解

List<Student> getStudentByName(@Param("name") String name);

choose/when/otherwise

多分支。提供id就用id查询,否则提供name就用name查询,否则返回空

<select id="getStudentByIdOrName" resultMap="studentMap">
    SELECT * FROM student
    <choose>
        <when test="id!=null">
            WHERE id=#{id}
        </when>
        <when test="name!=null">
            WHERE name=#{name}
        </when>
        <otherwise>
            WHERE 1=2
        </otherwise>
    </choose>
</select>

trim/where/set

where用于给内部的SQL添加where前缀。

上面的例子WHERE写了三次

<select id="getStudentByIdOrName" resultMap="studentMap">
    SELECT * FROM student
    <where>
        <choose>
            <when test="id!=null">
                id=#{id}
            </when>
            <when test="name!=null">
                name=#{name}
            </when>
            <otherwise>
                1=2
            </otherwise>
        </choose>
    </where>
</select>

trim用于除去并替换内部SQL的前缀,下图是去掉内部SQL的and前缀加入where

我觉得这个应用场景可能在于使用foreach时,循环生成一些条件,然后第一个前缀是where,其它的前缀是and,但你生成时为了方便肯定全部写的是and。

set用于去掉首个逗号并添加set前缀,主要用于update语句

可以看作<trim prefix="set" prefixOverrides=","></trim>

foreach

<select id="getStudentByIds" resultMap="studentMap">
    SELECT * FROM student WHERE id IN
    <foreach item="id" index="index" collection="idList"
                open="(" separator="," close=")">
        #{id}
    </foreach>
</select>
List<Student> getStudentByIds(@Param("idList") List<Long> idList);

bind

就是在xml中实现字符串拼接并定义一个变量,感觉没有concat好用

posted @ 2021-09-28 17:22  yudoge  阅读(30)  评论(0编辑  收藏  举报