Mybatis動態(tài)Sql映射標簽總結(jié)

<select>、<insert>、<update>、<delete>
<trim>:trim標簽主要就是標記的作用,可以去掉if條件不滿足時多余的and或者or或者,等等,和set標簽或者where標簽相通。
trim標記是一個格式化的標記,可以完成set或者是where標記的功能,如下代碼:

1、

  select * from user 

  <trim prefix="WHERE" prefixoverride="AND |OR">

    <if test="name != null and name.length()>0"> AND name=#{name}</if>

    <if test="gender != null and gender.length()>0"> AND gender=#{gender}</if>

  </trim>

假如說name和gender的值都不為null的話打印的SQL為:select * from user where name = 'xx' and gender = 'xx'

在紅色標記的地方是不存在第一個and的,上面兩個屬性的意思如下:

prefix:前綴

prefixoverride:去掉第一個and或者是or

2、

  update user

  <trim prefix="set" suffixoverride="," suffix=" where id = #{id} ">

    <if test="name != null and name.length()>0"> name=#{name} , </if>

    <if test="gender != null and gender.length()>0"> gender=#{gender} ,  </if>

  </trim>

假如說name和gender的值都不為null的話打印的SQL為:update user set name='xx' , gender='xx' where id='x'

在紅色標記的地方不存在逗號,而且自動加了一個set前綴和where后綴,上面三個屬性的意義如下,其中prefix意義如上:

suffixoverride:去掉最后一個逗號(也可以是其他的標記,就像是上面前綴中的and一樣)

suffix:后綴

<where>:where是sql語句中的關(guān)鍵字,把他作為標簽是防止sql語句中where之后的判斷語句不成立,多出where關(guān)鍵字,使得sql語句出錯。

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  WHERE 
  <if test="state != null">
    state = #{state}
  </if> 
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>

<set>:使用set標簽可以將動態(tài)的配置SET 關(guān)鍵字,和剔除追加到條件末尾(if語句中)的任何不相關(guān)的逗號。

<update id="updateByPrimaryKeySelective" parameterType="RecruitmentConfBanner">
        UPDATE conf_banner t
        <set> 
            <if test="bannerName != null">
                t.banner_name = #{bannerName},
            </if>
            <if test="bannerUrl != null">
                t.banner_url = #{bannerUrl},
            </if>
            <if test="bannerLogo != null">
                t.banner_logo = #{bannerLogo},
            </if>
            <if test="bannerDescription != null">
                t.banner_description = #{bannerDescription},
            </if>
            <if test="sort != null">
                t.sort = #{sort},
            </if>
             <if test="isEnabled != null">
                t.is_enabled = #{isEnabled},
            </if>
        </set>
        where t.banner_id = #{bannerId}
    </update>

mybatis接受的參數(shù)分為:(1)基本類型(2)對象(3)List(4)數(shù)組(5)Map

無論傳哪種參數(shù)給mybatis,他都會將參數(shù)放在一個Map中:
如果傳入基本類型:變量名作為key,變量值作為value 此時生成的map只有一個元素。
如果傳入對象: 對象的屬性名作為key,屬性值作為value,
如果傳入List: "list"作為key,這個List是value (這類參數(shù)可以迭代,利用<foreach>標簽實現(xiàn)循環(huán))
如果傳入數(shù)組: "array"作為key,數(shù)組作為value(同上)
如果傳入Map: 鍵值不變。
<foreach>:標簽有循環(huán)的功能,可以用來生成有規(guī)律的SQL語句,主要屬性有:
item:表示集合每一個元素進行迭代時的別名
index:表示在迭代過程中,每次迭代到的位置
open:表示該語句已什么開始
separator:表示每次迭代之間以什么符號作為分隔
close:表示該語句已什么結(jié)束
collection:需要迭代的變量

<update id="pubS" parameterType="Map">  
  UPDATE BMC_SUBPLATE  
  SET PLSTATUS = '02'  
  WHERE  
  <foreach collection="ids" item="plid" open="" close="" separator="OR">  
   PLID = #{plid}  
  </foreach>  
 </update> 

collection的值其實就是mybatis把參數(shù)轉(zhuǎn)化成Map以后,這個Map的key,但是這個key對應(yīng)的value必須是一個集合, 可以是數(shù)組,也可以是List
生成的動態(tài)sql:
Executing: UPDATE BMC_SUBPLATE SET PLSTATUS = '02' WHERE PLID = ? OR PLID = ?
Parameters: 20121116144947537692(String), 20121116141301414855(String)

<if>:查詢標簽
<choose>:查詢標簽,choose(when,otherwise)相當于java中的switch/case
if和choose酌情使用
<bind>:可以從 OGNL 表達式中創(chuàng)建一個變量并將其綁定到上下文。比如:

<select id="selectBlogsLike" resultType="Blog">
  <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM BLOG
  WHERE title LIKE #{pattern}
</select>

下面是映射xml文件中的其他一些標簽的用法:
<parameterMap>
<include>:標簽引入sql片段,通過<sql>的id值,引用一些可以重復(fù)使用的代碼段。
<resultMap>:將sql標簽執(zhí)行的結(jié)果返回,逐一定義列名和對象屬性名之間的映射關(guān)系。
<selectKey>:在不支持自增的主鍵而生成的策略標簽。
SelectKey在Mybatis中是為了解決Insert數(shù)據(jù)時不支持主鍵自動生成的問題,他可以很隨意的設(shè)置生成主鍵的方式。

不管SelectKey有多好,盡量不要遇到這種情況吧,畢竟很麻煩。

selectKey Attributes
屬性 描述
keyProperty selectKey 語句結(jié)果應(yīng)該被設(shè)置的目標屬性。
resultType 結(jié)果的類型。MyBatis 通??梢运愠鰜?但是寫上也沒有問題。MyBatis 允許任何簡單類型用作主鍵的類型,包括字符串。
order 這可以被設(shè)置為 BEFORE 或 AFTER。如果設(shè)置為 BEFORE,那么它會首先選擇主鍵,設(shè)置 keyProperty 然后執(zhí)行插入語句。如果設(shè)置為 AFTER,那么先執(zhí)行插入語句,然后是 selectKey 元素-這和如 Oracle 數(shù)據(jù)庫相似,可以在插入語句中嵌入序列調(diào)用。
statementType 和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 語句的映射類型,分別代表 PreparedStatement 和CallableStatement 類型。

SelectKey需要注意order屬性,像Mysql一類支持自動增長類型的數(shù)據(jù)庫中,order需要設(shè)置為after才會取到正確的值。
像Oracle這樣取序列的情況,需要設(shè)置為before,否則會報錯。

下面是一個xml和注解的例子,SelectKey很簡單,兩個例子就夠了

<insert id="insert" parameterType="map">  
    insert into table1 (name) values (#{name})  
    <selectKey resultType="java.lang.Integer" keyProperty="id">  
      CALL IDENTITY()  
    </selectKey>  
  </insert>  

上面xml的傳入?yún)?shù)是map,selectKey會將結(jié)果放到入?yún)?shù)map中。用POJO的情況一樣,但是有一點需要注意的是,keyProperty對應(yīng)的字段在POJO中必須有相應(yīng)的setter方法,setter的參數(shù)類型還要一致,否則會報錯。

@Insert("insert into table2 (name) values(#{name})")  
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)  
int insertTable2(Name name);  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容