1. 程式人生 > 其它 >Mybatis中的sql標籤、include標籤、trim標籤、foreach 標籤用法

Mybatis中的sql標籤、include標籤、trim標籤、foreach 標籤用法

Mybatis中的sql標籤、include標籤、trim標籤、foreach 標籤用法

foreach就是迴圈語句:

foreach元素的屬性主要有item,index,collection,open,separator,close。

  • item:集合中元素迭代時的別名,該引數為必選。
  • index:在list和陣列中,index是元素的序號,在map中,index是元素的key,該引數可選
  • open:foreach程式碼的開始符號,一般是(和close=")"合用。常用在in(),values()時。該引數可選
  • separator:元素之間的分隔符,例如在in()的時候,separator=","會自動在元素中間用“,“隔開,避免手動輸入逗號導致sql錯誤,如in(1,2,)這樣。該引數可選。
  • close: foreach程式碼的關閉符號,一般是)和open="("合用。常用在in(),values()時。該引數可選。
  • collection: 要做foreach的物件,作為入參時,List物件預設用"list"代替作為鍵,陣列物件有"array"代替作為鍵,Map物件沒有預設的鍵。當然在作為入參時可以使用@Param("keyName")來設定鍵,設定keyName後,list,array將會失效。 除了入參這種情況外,還有一種作為引數物件的某個欄位的時候。舉個例子:如果User有屬性List ids。入參是User物件,那麼這個collection = "ids".如果User有屬性Ids ids;其中Ids是個物件,Ids有個屬性List id;入參是User物件,那麼collection = "ids.id"

 

在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況: 

  • 如果傳入的是單引數且引數型別是一個List的時候,collection屬性值為list .
  • 如果傳入的是單引數且引數型別是一個array陣列的時候,collection的屬性值為array .
  • 如果傳入的引數是多個的時候,我們就需要把它們封裝成一個Map了,當然單引數也可以封裝成map,實際上如果你在傳入引數的時候,在MyBatis裡面也是會把它封裝成一個Map的,map的key就是引數名,所以這個時候collection屬性值就是傳入的List或array物件在自己封裝的map裡面的key.

sql標籤:

  sql 標籤就是將 出現次數過多的一段程式碼抽取出了,要使用的時候直接使用id就好了 ,一般抽取的是同一表中的程式碼,不同表就沒有必要怎麼做。

 抽取資料庫名:

<!-- sql 就是將程式碼抽取出來,然後使用的時候直接呼叫 id 減少了程式碼量的開發 -->
    <sql id="BASE_TABLE">
        t_attach
    </sql>

 

include標籤:

  include的用法,一般寫在增刪查改語句中,不單獨使用。

  它的功能就是將  sql  標籤抽取出來的程式碼拿來使用如:

    <!-- 刪除附件 -->
    <delete id="deleteAttAch">
        DELETE FROM
        <include refid="BASE_TABLE"/>
        WHERE
        id = #{id, jdbcType=INTEGER}
    </delete>

執行後的程式碼: DELETE    FROM    t_attach    WHERE   id = #{id, jdbcType=INTEGER}

 

 

trim標籤用法:

  trim 標記是一個格式化的標記,可以完成set或者是where標記的功能,個人理解它就是一個把程式碼拆分後重新拼裝。

程式碼如下:

 <!-- 批量新增附件 -->
    <insert id="batchAddAttAch" parameterType="list" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO
        <include refid="BASE_TABLE"/>
        <trim prefix="(" suffix=")" suffixOverrides=",">
            fname, ftype, fkey, authorId, created,
        </trim>
        VALUES
        <foreach collection="list" item="AttAchDomain" index="index" separator=",">
            (
            
              <trim suffix="" suffixOverrides=",">
                  #{fname, jdbcType=VARCHAR}, #{ftype, jdbcType=VARCHAR}, #{authorId,jdbcType=INTEGER}, UNIX_TIMESTAMP(NOW())
              </trim>
            )
        </foreach>
    </insert>

 

trim中的   prefix="("   就是將程式碼最前面加上  (      然後   suffix=")"   就是將程式碼的最後面加上  )    在然後  suffixOverrides=","  就是去除最後一個  ,號。

如果是 prefixOverrides=" and "  就是去除追前面的 and符號。是去除   trim  標記包裹的程式碼。

執行後的程式碼:INSERT INTO  t_attach     ( fname, ftype, fkey, authorId, created)VALUES

(#{fname, jdbcType=VARCHAR}),

( #{ftype, jdbcType=VARCHAR}),

(#{authorId,jdbcType=INTEGER}),

(UNIX_TIMESTAMP(NOW()) )  

 其中就是擷取現在的時間(UNIX_TIMESTAMP(NOW()) )  

上面就是執行程式碼

我們來分析下面的   foreach   就是迴圈語句,其中 collection: 就是型別就是迴圈語句體裡面的資料是什麼型別,collection="list" 現在就是 list,

一般collection最任意出錯,一般分為3中,list、array、map。

item:就是迭代器的別名,就是給這個方法取給名字,

index:在 list 中就是序號,在map中就是key值

separator:會自動在元素中間用“,“隔開,避免手動輸入逗號導致sql錯誤

<foreach collection="list" item="AttAchDomain" index="index" separator=",">

(

)

</foreach>