1. 程式人生 > 其它 >mybatis 陣列 新增_Mybatis基本知識四:動態SQL介紹

mybatis 陣列 新增_Mybatis基本知識四:動態SQL介紹

技術標籤:mybatis 陣列 新增

上一篇文章:《Mybatis基本知識三:單表查詢☞屬性名與查詢欄位的對映》

才疏學淺,若文中有紕漏,請多多指正!!!

  • 本節主要介紹動態SQL,其主要用於解決使用者提交的查詢條件不確定的情況。使用者提交的查詢條件不同,執行的SQL也就不同。若針對每種情況都一一列出來,將會出現大量SQL語句。針對這樣的情況可以用動態SQL解決。
  • 動態SQL的實現是通過MyBatis提供的各種標籤對查詢條件做出判斷實現動態拼接SQL語句的過程,其條件判斷是通過OGNL表示式實現。常用的標籤有<if/>、<where/>、<foreach/>等。
  • 當在mapper中使用動態SQL時,如果SQL中出現了諸如>(大於)、<(小於)、>=(大於等於)、<=(小於等於)等符號時,最好使用實體符號。否則,XML可能會出現解析錯誤的情況,因為mapper配置檔案中標籤是<和>拼接的。特別是對於<(小於號),XML中一出現肯定會出錯。

c59d42edfc2720b41df1b3bf9f2df619.png

1.練習原始碼地址

連結:https://pan.baidu.com/s/1LXz7bmvt2hO4kZud-BpEmQ 
提取碼:0w7r

2.測試準備(部分)

  • 資料庫
/**商品資訊*/
create table productinfo(
       id int primary key auto_increment, --主鍵
       proName varchar(50),--商品名稱
       proNo  varchar(50), --商品編號      
       proDescription  varchar(200),--商品描述
       proAmount decimal(10,2)--價格
);
  • 介面DAO
/**
 * 儲存
 */
public void saveProductInfo(ProductInfo info);

/**
 *  查詢測試<if/>標籤、<where/>  標籤、<choose/>標籤
 * @param statement 查詢id
 * @param productInfo 引數
 * @return
 */
List<ProductInfo> findProductInfo(String statement,ProductInfo productInfo);

//查詢測試foreach標籤
List<ProductInfo> findProductInfoForeach(String statement, Object obj);

//更新
void updatePro(ProductInfo productInfo);

3.常用標籤介紹

  • if 標籤

if標籤的執行,當test的值為true時,會將其包含的SQL片段拼接到SQL語句中。如果出現test都為false時,就會只有where,這時語句是有問題的,在where後新增一個"1=1"(全查)或"1!=1"(全不查)的條件。

<!-- if標籤 -->
    <select id="ifTags" resultType="ProductInfo">
        select * from productinfo where 1=1
        <if test="proName != null and proName != ''"><!-- 商品名稱不為空 -->
            and proName = #{proName}
        </if>
        <if test="proAmount > 10"><!-- 商品金額大於10 -->
            and proAmount > #{proAmount}
        </if>
    </select>
  • where 標籤

使用where標籤時,當有查詢條件時,會自動加上where子句。需要注意:第一個if標籤中SQL片段,可以不包含and,其他後續的必須包含and。

<!-- where標籤 -->
    <select id="whereTags" resultType="ProductInfo">
        select * from productinfo 
        <where>
            <if test="proName != null and proName != ''"><!-- 商品名稱不為空 -->
                and proName = #{proName}
            </if>
            <if test="proAmount > 10"><!-- 商品金額大於10 -->
                and proAmount > #{proAmount}
            </if>
        </where>
    </select>
  • choose標籤

choose標籤有點像java中的開關語句switch..case..功能(case 語句含beak)。該標籤只可以包含<when/>、<otherwise>,它可以包含多個<wher/>標籤與一個<otherwise>標籤。<choose/>標籤的執行,其會從第一個<when/>標籤開始,逐個向後進行條件判斷。若出現某個<when/>中的test屬性值為true,則會直接結束<choose/>標籤,不再執行其它<when/>標籤。若所有的<when/>的test屬性的值為false,則最後執行<otherwise/>標籤。

    <select id="chooseTags" resultType="ProductInfo">
        select * from productinfo 
        <where>
            <choose>
                <when test="proName != null and proName != ''"><!-- 商品名稱不為空 -->
                    and proName = #{proName}
                </when>
                <when test="proAmount > 10"><!-- 商品金額大於10 -->
                    and proAmount > #{proAmount}
                </when>
                <otherwise>
                    and 1 != 1
                </otherwise>
            </choose>
        </where>
    </select>
  • foreach標籤

該標籤主要用於實現對陣列和集合的遍歷。

collection:表示傳入過來的引數的資料型別。該引數為必選。要做 foreach 的物件,作為入參時,List 物件預設用 list 代替作為鍵,陣列物件有 array 代替作為鍵,Map 物件沒有預設的鍵。

大致可分為以下三種情況:

(1).如果傳入的是單引數且引數型別是一個List集合,collection屬性值為list .

(2).如果傳入的是單引數且引數型別是一個array陣列,collection的屬性值為array .

(3).如果傳入的引數是多個,此時最好是將它們封裝成一個Map,此時collection屬性值就是傳入的List或array物件在自己封裝的map裡面的key.

item: 迴圈體中的具體物件。

index:在list和陣列中,index是元素的序號;在map裡index 是元素的 key。

open:表示該語句以什麼開始。

close:表示該語句以什麼結束。

separator:表示在每次進行迭代之間以什麼符號作為分隔符。

<!-- foreach 單引數:陣列array -->
<select id="findProductInfoForeachArray" resultType="ProductInfo">
    select * from productInfo 
    <if test="array != null and array.length > 0">
        where id in
        <foreach collection="array" open="(" close=")" separator="," item="vid">
            #{vid}
        </foreach>
    </if>
</select>
<!-- foreach 單引數:基本型別 list-->
<select id="findProductInfoForeachListInteger" resultType="ProductInfo">
    select * from productInfo 
    <if test="list != null and list.size > 0">
        where id in
        <foreach collection="list" open="(" close=")" separator="," item="vid">
            #{vid}
        </foreach>
    </if>
</select>
<!-- foreach 單引數:自定義物件 list
    List<ProductInfo> param = new ArrayList<ProductInfo>();
    param.add(new ProductInfo(11));
    param.add(new ProductInfo(23));
-->
<select id="findProductInfoForeachListObj" resultType="ProductInfo">
    select * from productInfo 
    <if test="list != null and list.size > 0">
        where id in
        <foreach collection="list" open="(" close=")" separator="," item="pro">
            #{pro.id}
        </foreach>
    </if>
</select>
<!-- foreach 多引數:map
    Map<Object,Object> map = new HashMap<Object,Object>();
    map.put("proName", "商品4號");
    map.put("ids", new Object[]{3,4,5,6,7});
-->
<select id="findProductInfoForeachMap" resultType="ProductInfo">
    select * from productInfo where proName = #{proName}
    <if test="ids != null">
        and id in
        <foreach collection="ids" open="(" close=")" separator="," item="vid">
            #{vid}
        </foreach>
    </if>
</select>
  • sql標籤

該標籤主要用於定義SQL片段,以便於其他SQL複用。其它標籤使用<sql/>標籤時需要使用<include/>標籤引入。

<!-- sql標籤 -->
<sql id="sqlName">
    select * from productinfo 
</sql>
<select id="sqlTags" resultType="ProductInfo">
    <include refid="sqlName"/>
    where id > 6
</select>
  • set 標籤

該標籤主要用於更新語句中,一般和<if/>標籤連用。自動根據<if/>標籤的判斷結果拼接,當都判斷為false時,不進行拼接。

<!-- set標籤 -->
<update id="setTags">
    update productInfo
    <set>
        <if test="proName != null and proName != ''">
            proName = #{proName},
        </if>
        <if test="proNo != null and proNo != ''">
            proNo = #{proNo},
        </if>
        <if test="proDescription != null and proDescription != ''">
            proDescription = #{proDescription},
        </if>
        <if test="proAmount != null and proAmount > 0">
            proAmount = #{proAmount}
        </if>
    </set>
    where id = #{id}
</update>
  • ^_^ 點選關注哦 ^_^