最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis之關于動態(tài)SQL解讀

 更新時間:2023年06月28日 14:38:36   作者:不是很菜的菜  
這篇文章主要介紹了MyBatis之關于動態(tài)SQL解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

MyBatis動態(tài)SQL

MyBatis 動態(tài)SQL優(yōu)點

MyBatis 的強大特性之一便是它的動態(tài) SQL。

如果你有使用 JDBC 或其他類似框架的經(jīng)驗,你就能體會到根據(jù)不同條件拼接 SQL 語句有多么痛苦,拼接的時候要確保不能忘了必要的空格,還要注意省掉列名列表最后的逗號。

利用動態(tài) SQL 這一特性可以徹底擺脫這種痛苦。

1、if

動態(tài) SQL 通常要做的事情是有條件地包含 where 子句的一部分,例如

<select id="getByDept"  resultType="City">
        select * from provice
        <where>
               <if test="pid!=null">
                    pid=#{pid} 
                </if>
        </where>
    </select>

當滿足if中的條件是就會把if中條件也加入進sql語句中,否則不會。

例如當pid不能與null時,就會查找provice表中pid為傳入的值的數(shù)據(jù),但是當pid=null時,就會查找provice表中的所有數(shù)據(jù)。

2、choose (when, otherwise) 

有些時候你并不想用到所有條件,但是有時候你又想用到這個條件,這個時候我們就可以用到choose(when,otherwise),這類似于java中的switch-case。

<select id="findStudentByChoose" resultType="City">
        SELECT * from city where 1=1
        <choose>
            <when test="cname!=null and cname!=''">
                and cname like concat(concat('%',#{cname}),'%')
            </when>
            <when test="pid!=0">
                and pid=#{pid}
            </when>
            <otherwise>
				<!-- 這里可以寫,也可以不寫代碼-->
            </otherwise>
        </choose>
    </select>

這里提供了兩種選擇方式,你可以選擇根據(jù)cname來查找,也可以選擇根據(jù)pid來查找,但只要滿足一個條件,其他條件則自動選擇不滿足,這樣也可以避免無意義的查找。

(上面的1=1也可以不寫,但是需要加入其他的東西,下面會提到)

3、trim(where)

前面例子已經(jīng)合宜地解決了動態(tài) SQL 問題,但是看下面的例子

<select id="getByDept"  resultType="City">
        select * from provice where
               <if test="pid!=null">
                    pid=#{pid} and
                </if>
                <if test="cname!=null and cname!=''">
                    and pname like concat(concat('%',#{cname}),'%')
               </if>
    </select>

當沒有一個條件滿足時,這會變成

select * from provice where

這樣的sql語句并不正確,另外當?shù)谝粋€條件不滿足,第二個條件滿足時則會變成

select * from provice where
and pname like concat(concat('%',#{cname}),'%')

這個查詢也會失敗。

這個問題不能簡單的用條件句式來解決,這個時候我們就可以選擇使用trim(where)

<select id="getByDept"  resultType="City">
        select * from provice where
            <trim suffix="" suffixOverrides="and">
               <if test="pid!=null">
                    pid=#{pid} and
                </if>
                <if test="cname!=null and cname!=''">
                    and pname like concat(concat('%',#{cname}),'%')
               </if>
            </trim>
    </select>

where 元素知道只有在一個以上的if條件有值的情況下才去插入"WHERE"子句。

而且,若最后的內(nèi)容是"AND"或"OR"開頭的,where 元素也知道如何將他們?nèi)コ?/p>

如果 where 元素沒有按正常套路出牌,我們還是可以通過自定義 trim 元素來定制我們想要的功能。

4、foreach

動態(tài) SQL 的另外一個常用的必要操作是需要對一個集合進行遍歷,通常是在構建 IN 條件語句的時候。

注意 你可以將一個 List 實例或者數(shù)組作為參數(shù)對象傳給 MyBatis,當你這么做的時候,MyBatis 會自動將它包裝在一個 Map 中并以名稱為鍵。

List 實例將會以"list"作為鍵,而數(shù)組實例的鍵將是"array"。

例如:

<!--根據(jù)數(shù)組來找-->
    <select id="findStudentByArray" resultType="City">
        SELECT * from city where pid in 
        <foreach collection="array" item="pid" open="(" separator="," close=")">
            #{pid}
        </foreach>
    </select>
    <!--根據(jù)列表來找-->
    <select id="findStudentByList" resultType="City">
        select * from city WHERE pid in
        <foreach collection="list" item="pid" open="(" separator="," close=")">
            #{pid}
        </foreach>
    </select>
    <!--根據(jù)map來找-->
    <select id="findStudentByMap" resultType="City">
        SELECT * from city where cname like concat(concat('%',#{cname}),'%') and pid in
        				<!--這里的name則根據(jù)前面?zhèn)魅氲膋ey值來確定-->
        <foreach collection="name" item="map" open="(" separator="," close=")">
            #{map}
        </foreach>
    </select>

5、bind

bind 元素可以從 OGNL 表達式中創(chuàng)建一個變量并將其綁定到上下文。

例如

<select id="bind" resultType="Provice">
  <bind name="pro" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM porvice
  WHERE pid LIKE #{pro}
</select>

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • JDK1.8中的ConcurrentHashMap使用及場景分析

    JDK1.8中的ConcurrentHashMap使用及場景分析

    這篇文章主要介紹了JDK1.8中的ConcurrentHashMap使用及場景分析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java反射機制的講解

    Java反射機制的講解

    今天小編就為大家分享一篇關于Java反射機制的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • struts2 中文亂碼的解決辦法分享

    struts2 中文亂碼的解決辦法分享

    這篇文章主要介紹了struts2 中文亂碼的解決辦法,需要的朋友可以參考下
    2014-02-02
  • SpringBoot集成ENC對配置文件進行加密的流程步驟

    SpringBoot集成ENC對配置文件進行加密的流程步驟

    Spring Boot Encoder,即Spring Boot加密模塊,它提供了一種簡單的方式來集成安全編碼功能到Spring Boot應用程序中,它是Spring Security框架的一部分,旨在幫助開發(fā)者輕松地處理數(shù)據(jù)加密,本文給大家介紹了SpringBoot集成ENC對配置文件進行加密的流程步驟
    2024-12-12
  • Spring?Boot實現(xiàn)配置文件的自動加載和刷新功能

    Spring?Boot實現(xiàn)配置文件的自動加載和刷新功能

    這篇文章我們介紹了Spring?Boot如何實現(xiàn)配置文件的自動加載和刷新,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-05-05
  • Java日常練習題,每天進步一點點(41)

    Java日常練習題,每天進步一點點(41)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • springboot跨域CORS處理代碼解析

    springboot跨域CORS處理代碼解析

    這篇文章主要介紹了springboot跨域CORS處理代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • java使用stream判斷兩個list元素的屬性并輸出方式

    java使用stream判斷兩個list元素的屬性并輸出方式

    這篇文章主要介紹了java使用stream判斷兩個list元素的屬性并輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • IDEA類存在但找不到的解決辦法

    IDEA類存在但找不到的解決辦法

    本文主要介紹了IDEA類存在但找不到的解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • java中TESTful架構原理分析

    java中TESTful架構原理分析

    這篇文章主要介紹了對java架構中TESTful架構原理進行了詳細的原理分析,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進步,早日升職加薪
    2021-09-09

最新評論

绥芬河市| 天门市| 内江市| 久治县| 双江| 元江| 秀山| 博客| 江川县| 乌苏市| 宁武县| 内丘县| 常山县| 涟水县| 灵寿县| 兴文县| 慈溪市| 阿合奇县| 普格县| 南昌县| 菏泽市| 乡宁县| 洛扎县| 金门县| 孟村| 大荔县| 麻城市| 融水| 万州区| 行唐县| 民县| 浮山县| 阳春市| 同心县| 肥西县| 迭部县| 汉川市| 赤城县| 鱼台县| 津南区| 横峰县|