在使用Mybatis时写sql语句是必须的,在写sql语句时如果涉及到根据条件拼接的sql语句的话就要处理wher、and、 in 这样的字符串,而Mybatis中有满足这样的标签可以让我们不用为处理这样的字符串而苦恼。下面收集和总结了一下比较常用的标签:

trim标签

               prefix:前缀覆盖并增加其内容 不写的话默认替换为空

               suffix:后缀覆盖并增加其内容 不写的话默认替换为空

                prefixOverrides:前缀判断的条件

               suffixOverrides:后缀判断的条件

一个trim只能去掉一个需要去掉的sql的前缀或者后缀。

<span style="font-size:18px;"><select id="pageListBookByNameAndTypeAndPages" resultMap="pojoBooks">
    select * from books where 1=1 and
    <trim suffixOverrides="and" prefixOverrides="and">
        <if test="books!=null">

            <if test="books.book_name!=null and books.book_name==''">
                and book_name like"%" #{books.book_name} "%" and
            </if>
            <if test="books.book_type!=null and books.book_type==''">
              and  book_type like "%"#{books.book_type} "%"
            </if>

        </if>

        <if test="pages!=null">
          and  limit #{pages.pageStart},#{pages.pageEnd} and
        </if>
    </trim>
</select></span>



打印出的sql:

SQL: select* from books where 1=1 and          book_name like "%" ? "%" and    and  book_type like "%"? "%"   and limit ?,?


可见我们的第一个and和最后一个and被去除了,但是中间的没有被去掉。所以说trim是针对trim标签中的整个sql而言。

我们在看另一个sql语句:

<span style="font-size:18px;"><select id="pageListBookByNameAndTypeAndPages" resultMap="pojoBooks">
    select * from books where 1=1 and
    <trim suffixOverrides="and" prefixOverrides="and">
        <if test="books!=null">
            <if test="books.book_name!=null and books.book_name==''">
                and book_name like"%" #{books.book_name} "%" and
            </if>
            <if test="books.book_type!=null and books.book_type==''">
                book_type like"%" #{books.book_type} "%"
            </if>
        </if>
        <trim prefixOverrides="and">
        <if test="pages!=null">
           and limit#{pages.pageStart},#{pages.pageEnd} and
        </if>
        </trim>
    </trim>
</select></span>

这样得到的结果是:

select *from books where 1=1 and book_name like "%" ? "%" and book_type like "%" ? "%" limit ?,?

可见,一个trim只能去掉trim标签内的一个前缀或者后缀。


Include标签

<include refid="" ></include>是包含一个<sql> 的语句片段。

 

Foreach标签:

用来遍历我们的list或者数组;如:

<span style="font-size:18px;"><delete id="delBooks" >
    delete from books
    <where>
        book_id in
 <foreach collection="list" item="bookid" open="(" separator="," close=")" >
            #{bookid}
        </foreach>
    </where>
</delete></span>

对于要指定范围的bookid我们就可以这样达到效果,这里值得注意的是如果没有设置@param那个list或者数组的参数名的话,MyBatis会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list” 作为键,而数组实例将会以“array”作为键。index是当前迭代的次数,item的值是本次迭代获取的元素。当使用字典(或者Map.Entry对象的集合)时,index是键,item是值。

 

Where标签:

Where标签中如果都是if标签那至少需要一个if标签满足才插入where。如果里面有没有被<if>标签包裹的字符串,那这个where就会被拼接到最后的sql语句中;有同学说 如果若最后的内容是“AND”或“OR”开头的,where 标签可以自己将他们去除。我做了一下验证:

<span style="font-size:18px;">    <delete id="delBooks" >
        delete from books
        <where>
            and
            book_id in
            <foreach collection="mydelbookids" item="bookid" open="(" separator="," close=")">
                #{bookid}
            </foreach>
            and
        </where>
    </delete></span>


打印的sql语句是:

Preparing: delete from books WHERE book_id in ( ? , ? ) and 


<delete id="delBooks" >
        delete from books
        <where>
            and book_id=70 and
        </where>
    </delete>


打印的sql语句是:


delete from books          WHERE  book_id=70 and


where 能去掉开头的 and 但是不能去除结尾的and (也可能我书写的方式不对)。

<set>标签:

<span style="font-size:18px;"><update id="updateBook">
    <if test="books.book_state==0">
        update books
        <set>
            <if test="books.book_name!=null">
               book_name=#{books.book_name},
            </if>
            <if test="books.book_price!=null">
                book_price=#{books.book_price},
            </if>
            <if test="books.book_content!=null">
               book_content=#{books.book_content},
            </if>
            <if test="books.book_type!=null">
               book_type=#{books.book_type},
            </if>
            <if test="books.cover!=null">
                book_cover=#{books.cover}
            </if>
        </set>
    </if>
    where book_id = #{books.book_id}
</update></span>

用于update中,满足条件的才更新值。