1. 程式人生 > >MyBatis學習之動態SQL

MyBatis學習之動態SQL

1、概述

MyBatis最為強大的部分是提供了動態SQL的支援,一些查詢邏輯可以直接在xml中完成,大大簡化了我們的操作,體現出了MyBatis的靈活性、拓展性、和可維護性。

MyBatis中的四大動態SQL元素:

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

2、使用

if元素

if元素是我們最為常用的判斷語句,test屬性相當於條件,使用起來也十分簡單。

<select id="queryByNameAndCity" resultType="com.lzx.entity.Author">
    select * from author where 1=1
    <if test="name != null and name != ''">
        and name = #{name}
    </if>
    <if test="city != null and city != ''">
        and city = #{city}
    </if>
</select>

choose、when、otherwise元素

當條件較多時,很明顯我們使用if元素就不是那麼合適。MyBatis給我們提供了類似java中的switch…case…default語句,即choose…when…otherwise

<select id="queryByNameAndCity" resultType="com.lzx.entity.Author">
    select * from author where 1=1
    <choose>
        <when test="name != null and name != ''">
            and name = #{name}
        </when>
        <otherwise>
            and city is not null
        </otherwise>
    </choose>
</select>

trim, where, set元素

回到最初的if元素中,我們會發現如果所有的條件都不成立,那麼條件"1=1"就十分奇怪,在這裡我們可以使用where元素進行修改

<select id="queryByNameAndCity" resultType="com.lzx.entity.Author">
    select * from author
    <where>
        <if test="name != null and name != ''">
            and name = #{name}
        </if>
        <if test="city != null and city != ''">
            and city = #{city}
        </if>
    </where>
</select>

有些時候我們需要去掉一些特殊的SQL語句,比如and、or,這個時候我們可以使用trim元素。trim元素意味著去掉一些字串,prefix代表的是語句的字首,prefixOverrides代表的是需要去掉的字串。

<select id="queryByName" resultType="com.lzx.entity.Author">
    select * from author
    <trim prefix="where" prefixOverrides="and">
        <if test="name != null and name != ''">
            and name = #{name}
        </if>
    </trim>
</select>

set元素,我們常用到更新語句中

<update id="updateAuthor">
    update author
    <set>
        <if test="name != null and name != ''">
            name = #{name}
        </if>
        <if test="city != null and city != ''">
            city = #{city}
        </if>
    </set>
    where id = #{id}
</update>

foreach元素

foreach是一個迴圈語句,他的作用是遍歷集合,支援陣列和集合。我們可以用來批量刪除或者批量新增。

  • collection元素是傳過來的集合名
  • item是迴圈中的元素
  • index是當前元素的下標
  • open和close代表使用什麼符號包括這些集合元素
  • separator是各元素的間隔符
<insert id="insertAuthor">
	insert into author values
	<foreach collection="authorList" index="id" item="author" separator=",">
	    (#{name},#{city})
	</foreach>
</insert>
<delete id="deleteAuthor">
    delete author where id in
    <foreach collection="id" index="index" item="id" open="(" close=")" separator=",">
        #{id}
    </foreach>
</delete>

blind元素

bind 元素可以從 OGNL 表示式中建立一個變數並將其繫結到上下文。

<select id="queryByNameAndCity" resultType="com.lzx.entity.Author">
    <blind name="a_name" value="'%' + name + '%'"/>
    <blind name="a_name" value="'%' + city + '%'"/>
    select * from author where name = #{a_name} and city = #{a_city}
</select>