MyBatis對動態SQL的支援

爪哇島的流浪漢發表於2018-07-16


1.MyBatis動態SQL
    動態SQL是MyBatis框架中特性之一,在一些組合查詢頁面需要根據
    使用者輸入的條件生成不同的查詢SQL語句,在JDBC中需要在程式碼中
    拼接sql,容易出錯,MyBatis可以解決這種問題

    動態SQL標籤與JSTL相似,它允許在XML中構建不同sql語句,常用
    SQL標籤如下:
    判斷標籤:if,choose
    關鍵字標籤:where,set,trim
    迴圈標籤:foreach

    if標籤是簡單條件判斷邏輯,滿足指定條件時追加if標籤內sql語句,
    不滿足時不追加,使用格式如下:
    <select>
        sql語句1
        <if test="條件表示式">
            sql語句2
        </if>
    </select>    
        
    if標籤最常見的使用在where字句部分,根據不同情況追加不同的
    sql語句

    choose標籤的作用相當於Java的switch語句,基本上跟JSTL中的
    choose的作用是一樣的,通常與when和otherwise搭配使用,使
    用格式如下:
    <select>
        sql語句1
        <choose>
            <when test="條件表示式">
                sql語句2
            </when>
            <when test="條件表示式">
                sql語句3
            </when>
            <otherwise>
                sql語句4
            </otherwise>
        </choose>
    </select>
    
    where標籤可以在<where>所在的位置輸出一個where關鍵字,而
    且還可以將後面多餘的and或者or關鍵字去除,使用格式如下:
    <select>
        select * from emp 
        <where>
            <if test="deptno != null">
                deptno = #{deptno}
            </if>
            <if test="salary != null">
                and salary = #{salary}
            </if>
        </where>    
    </select>    
    
    set標籤主要是用在更新操作時,它的主要功能和where標籤相似,
    主要是在<set>所在的位置輸出一個set關鍵字,而且還可以去除
    內容結尾中無關的逗號,使用格式如下:
    <updat>
        update emp
        <set>
            <if test="ename != null"> 
                ename=#{ename},
            </if>
            <if test="salary != null">
                salary=#{salary},
            </if>
            <if test="hiredate != null">
                hiredate=#{hiredate}
            </if>
        </set>    
        where empno = #{empno}
    </update>    

    trim標籤主要功能如下:
    1)可以在自己包含的內容前加上某些字首,也可以在其後加上某
        些字尾,與之對應的屬性是prefix和suffix
    2)可以把包含內容首部的某些內容過濾,即忽略,也可以把尾部
        的某些內容過濾,對應的屬性是prefixOverrides和suffixOverrides
        
    即trim標籤可以替代where標籤和set標籤

    <!-- 等價於where標籤 -->
    <trim prefix="where" prefixOverrides="and|or">
        ......
    </trim>    
    
    <!-- 等價於set標籤 -->
    <trim prefix="set" suffixOverrides=",">
        ......
    </trim>
            
    foreach標籤實現迴圈邏輯,可以進行一個集合的迭代,主要用在
    構建IN條件中,使用格式如下:
    <select>
        select * from emp where empno in
        <foreach collection="集合" item="迭代變數"    
            open="(" close=")" separator=",">
            #{迭代變數}
        </foreach>
    </select>    
            
    foreach標籤它允許指定一個集合,宣告集合項和索引變數,變數
    可以用在標籤體內,它允許指定開放和關閉的字串,在迭代項之
    間放置分隔符
    
    補充:在XML檔案中處理特殊符號
    第一種方法:採用XML轉義字元
    <                    &lt;
    >                    &gt;
    &                    &amp;
    '                    &apos;
    "                    &quot;
    空格                &nbsp;

    第二種方法:採用<[!CDATA[]]>進行說明,將此內容不進行解析
    
    <if test="">
        and <![CDATA[salary < 50000.0]]>
    </if>
    
2.MyBatis關聯對映
    1)主鍵對映
        在做插入操作時,可以由資料庫負責主鍵值生成
        主鍵欄位部分的對映可以分為兩種情況:
        資料庫支援自動遞增:例如MySQL,SQLServer    
        資料庫不支援自動遞增:例如Oracle
        
        業務:需要返回資料庫自動遞增的主鍵值
        
        MySQL:
        <insert id=""
            parameterType="com.xms.entity.Dept"
                useGeneratedKeys="true" keyProperty="deptno">
            insert into dept values(null,#{dname})
        </insert>
        
        在<insert>標籤指定自動遞增屬性設定後,MyBatis會在插入
        操作後將自動遞增生成的主鍵值給keyProperty指定的屬性賦值
        
        Oracle:
        <insert id=""
            parameterType="com.xms.entity.Dept">
            <selectKey keyProperty="deptno">
                select 序列名.nextval from dual
            </selectKey>
            insert into dept values(序列名.currval,#{dname})
        </insert>    
        在<insert>標籤指定<selectKey>設定後,MyBatis會在插入操
        作前先執行<selectKey>獲取主鍵值的sql,然後將主鍵值賦值給
        指定的主鍵屬性,最後再執行插入的sql
        
    2)多對一對映
        在查詢時需要獲取兩張或兩張以上關聯表的資料,通過關聯對映
        可以由一個物件獲取關聯物件的資訊,例如:查詢一個Emp員工
        物件,可以通過關聯對映獲取員工所在的部門Dept物件資訊    
    
        MyBatis的多對一有以下兩種不同的實現形式:
        1.巢狀查詢:通過執行另外一個SQL對映語句來返回關聯資料結
        果(查詢兩次)
        2.巢狀結果查詢:執行一個表關聯查詢SQL,然後將查詢結果映
        射成關聯物件(查詢一次)        
        
    3)一對多對映
        當查詢某個表的記錄資訊時,如果關聯表有多條相關記錄,此時
        就可以通過一對多對映,例如:查詢某個Dept部門物件資訊,
        通過一對多對映獲取此部門所有的Emp員工物件資訊

        MyBatis的一對多有以下兩種不同的實現形式:
        1.巢狀查詢:通過執行另外一個SQL對映語句來返回關聯資料結
        果(查詢兩次)
        2.巢狀結果查詢:執行一個表關聯查詢SQL,然後將查詢結果映
        射成關聯物件(查詢一次)    
    
    
    
        

    
    
    

    


    

相關文章