Mybatis 动态SQL


转载地址:http://www.itsoku.com/course/4/81

参考资料
1.MyBatis<foreach>标签的几种循环方法

⭕1.IF标签

当test成立的时候,if体内部的sql会被拼接上。

<select id="getList1" resultType="com.XXX.UserModel" parameterType="map">
    SELECT id,name,age FROM t_user
    WHERE 1 = 1
    <if test="id != null">
        AND id = #{id}
    </if>
    <if test="name!=null and name.toString() != '' ">
        AND name = #{name}
    </if>
    <if test="age != null">
        AND age = #{age}
    </if>
</select>

⭕2.choose/when/otherwise标签

相当于java中的if..else if..else

传入id、name、age作为条件,按顺序进行判断,如果id不为空,将id作为条件,忽略其他条件,如果id为空,会判断name是否为空,name不为空将name作为条件,如果name为空,再看看age是否为空,如果age不为空,将age作为条件。

<select id="getList2" resultType="com.XXX.UserModel" parameterType="map">
    SELECT id,name,age FROM t_user
    WHERE 1 = 1
    <choose>
        <when test="id != null">
            AND id = #{id}
        </when>
        <when test="name != null and name.toString() != '' ">
            AND name = #{name}
        </when>
        <when test="age != null">
            AND age = #{age}
        </when>
    </choose>
</select>

⭕3.set标签

如果我们不使用set标签的话,得到的SQL会变得多了个,号,SQL报错

UPDATE t_user SET name = ?, age = ?, where id = ?
<update id="update1" parameterType="com.XXX.UserModel">
    UPDATE t_user
    <set>
        <if test="name != null">
            name = #{name},
        </if>
        <if test="age != null">
            age = #{age},
        </if>
    </set>
    <!--使用where标签是为了避免WHERE 1 = 1这种写法 -->
    <where>
        <if test="id != null">
            AND id = #{id}
        </if>
    </where>
</update>

⭕4.trim标签

语法

<trim prefix="" prefixOverrides="" suffix="" suffixOverrides="">
</trim>

trim元素内部可以包含各种动态sql,如where、chose、sql等各种元素,使用trim包含的元素,mybatis处理过程:

  • 先对trim内部的sql进行拼接,比如这部分sql叫做sql1
  • 将sql1字符串前面的部分中包含trim的prefixOverrides指定的部分给去掉,得到sql2
  • 将sql2字符串后面的部分中包含trim的suffixOverrides指定的部分给去掉,得到sql3
  • 在sql3前面追加trim中prefix指定的值,得到sql4
  • 在sql4后面追加trim中suffix指定的值,得到最终需要拼接的sql5
<select id="getList1" resultType="com.XXX.UserModel" parameterType="map">
    SELECT id,name,age FROM t_user
    <!--多个需要覆盖的之间用|进行分割,suffixOverrides写法和prefixOverrides的写法类似-->
    <trim prefix="where" prefixOverrides="and|or">
        <if test="id != null">
            AND id = #{id}
        </if>
        <if test="name != null and name.toString() != '' ">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </trim>
</select>
<update id="update1" parameterType="com.XXX.UserModel">
    UPDATE t_user
    <trim prefix="SET" prefixOverrides="," suffixOverrides=",">
        <if test="name != null">
            name = #{name},
        </if>
        <if test="age != null">
            age = #{age},
        </if>
    </trim>
    <where>
        <if test="id != null">
            AND id = #{id}
        </if>
    </where>
</update>

⭕5.foreach标签

语法

<foreach collection="需要遍历的集合" item="集合中当前元素" index="" open="" separator="每次遍历的分隔符" close="">
动态sql部分
</foreach>
  • collection:可以是一个List、Set、Map或者数组
  • item:集合中的当前元素的引用
  • index:用来访问当前元素在集合中的位置
  • separator:各个元素之间的分隔符
  • openclose用来配置最后用什么前缀和后缀将foreach内部所有拼接的sql给包装起来。

⏹in多值查询

<select id="getList1" resultType="com.XXX.UserModel" parameterType="map">
    SELECT id,name,age FROM t_user
    <where>
        <if test="id != null">
            AND id = #{id}
        </if>
        <if test="name != null and name.toString() != '' ">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
        <if test="idList != null and idList.size() >= 1">
            <foreach collection="idList" item="id" open="AND id in (" separator="," close=")">
                #{id}
            </foreach>
        </if>
    </where>
</select>

⏹批量插入

<insert id="insertBatch" parameterType="list">
    INSERT INTO t_user (id,name,age) VALUES
    <foreach collection="collection" separator="," item="item">
        (#{item.id}, #{item.name}, #{item.age})
    </foreach>
</insert>

⭕6.sql和include标签

这两2个标签一般进行配合使用,可以实现代码重用的效果

⏹sql元素可以用来定义一段动态sql

<sql id="sql片段id">
各种动态sql
</sql>

⏹其他地方需要使用的时候需要通过include关键字进行引入

<include refid="需要引入的sql片段的id"/>

使用案例

<sql id="findSql">
    <where>
        <if test="id != null">
            AND id = #{id}
        </if>
        <if test="name != null and name.toString() != ''">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
        <if test="idList != null and idList.size() >= 1">
            <foreach collection="idList" item="id" open="AND id in (" separator="," close=")">
                #{id}
            </foreach>
        </if>
    </where>
</sql>

<select id="getList1" resultType="com.XXX.UserModel" parameterType="map">
    SELECT id,name,age FROM t_user
    <include refid="findSql" />
</select>

<select id="getList1Count" resultType="com.XXX.UserModel" parameterType="map">
    SELECT count(*) FROM t_user
    <include refid="findSql" />
</select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值