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

MyBatis之關(guān)于動(dòng)態(tài)SQL解讀

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

MyBatis動(dòng)態(tài)SQL

MyBatis 動(dòng)態(tài)SQL優(yōu)點(diǎn)

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

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

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

1、if

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

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

當(dāng)滿足if中的條件是就會(huì)把if中條件也加入進(jìn)sql語(yǔ)句中,否則不會(huì)。

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

2、choose (when, otherwise) 

有些時(shí)候你并不想用到所有條件,但是有時(shí)候你又想用到這個(gè)條件,這個(gè)時(shí)候我們就可以用到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來查找,但只要滿足一個(gè)條件,其他條件則自動(dòng)選擇不滿足,這樣也可以避免無意義的查找。

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

3、trim(where)

前面例子已經(jīng)合宜地解決了動(dò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>

當(dāng)沒有一個(gè)條件滿足時(shí),這會(huì)變成

select * from provice where

這樣的sql語(yǔ)句并不正確,另外當(dāng)?shù)谝粋€(gè)條件不滿足,第二個(gè)條件滿足時(shí)則會(huì)變成

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

這個(gè)查詢也會(huì)失敗。

這個(gè)問題不能簡(jiǎn)單的用條件句式來解決,這個(gè)時(shí)候我們就可以選擇使用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 元素知道只有在一個(gè)以上的if條件有值的情況下才去插入"WHERE"子句。

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

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

4、foreach

動(dòng)態(tài) SQL 的另外一個(gè)常用的必要操作是需要對(duì)一個(gè)集合進(jìn)行遍歷,通常是在構(gòu)建 IN 條件語(yǔ)句的時(shí)候。

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

List 實(shí)例將會(huì)以"list"作為鍵,而數(shù)組實(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 表達(dá)式中創(chuàng)建一個(gè)變量并將其綁定到上下文。

例如

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

總結(jié)

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

相關(guān)文章

  • JDK1.8中的ConcurrentHashMap使用及場(chǎng)景分析

    JDK1.8中的ConcurrentHashMap使用及場(chǎng)景分析

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

    Java反射機(jī)制的講解

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

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

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

    SpringBoot集成ENC對(duì)配置文件進(jìn)行加密的流程步驟

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

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

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

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(41)

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

    springboot跨域CORS處理代碼解析

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

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

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

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

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

    java中TESTful架構(gòu)原理分析

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

最新評(píng)論

鄂托克前旗| 昌江| 玛纳斯县| 勐海县| 深水埗区| 双辽市| 新闻| 平泉县| 木兰县| 海盐县| 汤阴县| 民县| 庄河市| 云龙县| 岫岩| 濮阳市| 宝鸡市| 怀柔区| 永康市| 八宿县| 南投市| 兰西县| 新泰市| 泰和县| 塔河县| 墨竹工卡县| 庆云县| 武鸣县| 筠连县| 雷州市| 始兴县| 东山县| 通河县| 佛冈县| 慈利县| 蓬溪县| 桂林市| 怀来县| 万山特区| 梁河县| 温州市|