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

MyBatis動(dòng)態(tài)SQL表達(dá)式詳解

 更新時(shí)間:2022年12月27日 11:43:06   作者:一個(gè)雙子座的Java攻城獅  
動(dòng)態(tài)SQL可以省略很多拼接SQL的步驟,使用類(lèi)似于JSTL方式,下面這篇文章主要給大家介紹了關(guān)于Mybatis動(dòng)態(tài)SQL特性的相關(guān)資料,文字通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

動(dòng)態(tài) sql 簡(jiǎn)單來(lái)講就是我們能通過(guò)條件的設(shè)置生成不同的 sql,MyBatis 中常用的動(dòng)態(tài) sql 表達(dá)式主要是有五種:

  • if
  • choose (when, otherwise)
  • trim, where, set
  • foreach
  • sql

if

動(dòng)態(tài) sql 中最常見(jiàn)的場(chǎng)景是根據(jù)條件查詢(xún),比如要實(shí)現(xiàn)一個(gè)查詢(xún)語(yǔ)句,當(dāng)不傳任何參數(shù)時(shí)查詢(xún)所有用戶,當(dāng)傳了 id 或者 name 時(shí)根據(jù)條件進(jìn)行查詢(xún),就可以這樣寫(xiě):

<select id="selectUserByMap" parameterType="map" resultType="user">
    select * from user where 1=1
    <if test="id != null and id!=''">
        and id=#{id}
    </if>
    <if test="name != null and name!=''">
        and name=#{name}
    </if>
</select>

對(duì)應(yīng)的 mapper 接口如下:

public interface UserMapper {
    List<User> selectUserByMap(Map<String,Object> param);
    void updateUser(Map<String,Object> param);
}

對(duì)應(yīng)的 Java 代碼如下:

Map<String,String> map=new HashMap<String, String>();
map.put("id","1");
map.put("name","javayz");
List<User> users = mapper.selectUserByMap(map);

當(dāng) map 中什么都不傳時(shí),sql 語(yǔ)句變?yōu)椋?/p>

select * from user where 1=1

當(dāng)傳了 id 或 name 時(shí),分別執(zhí)行對(duì)應(yīng)的查詢(xún)。

choose when otherwise

choose 的使用很像 Java 中的 switch 語(yǔ)法,當(dāng)滿足第一個(gè) when 條件時(shí),就不去看后續(xù)的條件,如果條件都不滿足,則執(zhí)行 otherwise:

<select id="selectUserByChoose" parameterType="map" resultType="user">
    select * from user where 1=1
    <choose>
        <when test="id != null">
            and id=#{id}
        </when>
        <when test="name != null">
            and name=#{name}
        </when>
        <otherwise>
            and 1=1
        </otherwise>
    </choose>
</select>

trim where set

還記得前面的語(yǔ)法中都寫(xiě)了 where 1=1 嗎,至于為什么這樣寫(xiě),目的在于讓語(yǔ)法能順利執(zhí)行,以 if 語(yǔ)句為例:如果不寫(xiě) 1=1,語(yǔ)法就會(huì)變成下面這樣:

<select id="selectUserByMap" parameterType="map" resultType="user">
    select * from user where
    <if test="id != null">
        id=#{id}
    </if>
    <if test="name != null">
        and name=#{name}
    </if>
</select>

這個(gè)時(shí)候如果滿足了第一個(gè) if 條件,那不會(huì)有問(wèn)題,但是如果只滿足第二個(gè)條件,語(yǔ)句就會(huì)變成:

select * from user where and name=?

語(yǔ)法直接報(bào)錯(cuò)。

MyBatis 提供了一種標(biāo)簽來(lái)代替 1=1 的寫(xiě)法,where 標(biāo)簽只會(huì)在子元素返回任何內(nèi)容的情況下才插入 “WHERE” 子句。而且,若子句的開(kāi)頭為 “AND” 或 “OR”,where 元素也會(huì)將它們?nèi)コ?/p>

<select id="selectUserByMap" parameterType="map" resultType="user">
    select * from user
    <where>
        <if test="id != null">
            and id=#{id}
        </if>
        <if test="name != null">
            and name=#{name}
        </if>
    </where>
</select>

set 的語(yǔ)法和 where 類(lèi)似,在更新時(shí)會(huì)用到 set:

<update id="updateUser" parameterType="map">
    update user
    <set>
        <if test="name != null">name =#{name},</if>
    </set>
    where id = #{id}
</update>

使用 where 時(shí)會(huì)用自動(dòng)去替換掉 and 或者 or,而使用 set 時(shí)會(huì)動(dòng)態(tài)地在行首插入 SET 關(guān)鍵字,并會(huì)刪掉額外的逗號(hào)。

使用 trim 可以用于去除拼接 sql 時(shí)的 and、or 關(guān)鍵字或者逗號(hào)等等。

之前使用 where 標(biāo)簽去除了最開(kāi)始的 and 關(guān)鍵字,用 trim 也同樣可以實(shí)現(xiàn):

<select id="selectUserByMap" parameterType="map" resultType="map">
    select * from user
    <trim prefix="where" prefixOverrides="and">
        <if test="id != null">
            and id=#{id}
        </if>
        <if test="name != null">
            and name=#{name}
        </if>
    </trim>
</select>

foreach

foreach 在需要對(duì)集合進(jìn)行遍歷的場(chǎng)景中使用很廣泛,尤其是在 in 語(yǔ)句中,比如下面這條語(yǔ)句:

select * from user where id in (1,2,3,4)

通過(guò) foreach 實(shí)現(xiàn)方式如下,foreach 中的 ids 可以是參數(shù)傳入的一個(gè) List 集合:

<select id="selectUserByForeach" parameterType="map" resultType="User">
    select * from user where id in
        <foreach collection="ids" item="id" index="index" open="(" separator="," close=")">
            #{id}
        </foreach>
</select>

sql片段

通過(guò) sql 片段標(biāo)簽,可以將重復(fù)的 sql 提取出來(lái),使用時(shí)通過(guò) include 引用即可。

<sql id="select_user_where">
    <if test="id != null and id!=''">
        and id=#{id}
    </if>
    <if test="name != null and name!=''">
        and name=#{name}
    </if>
</sql>
<select id="selectUserByMap" parameterType="map" resultType="user">
    select * from user where 1=1
    <include refid="select_user_where">
</select>

到此這篇關(guān)于MyBatis動(dòng)態(tài)SQL表達(dá)式詳解的文章就介紹到這了,更多相關(guān)MyBatis動(dòng)態(tài)SQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 快速了解Java中ThreadLocal類(lèi)

    快速了解Java中ThreadLocal類(lèi)

    這篇文章主要介紹了快速了解Java中ThreadLocal類(lèi),介紹了ThreadLocal 是什么,ThreadLocal的作用,ThreadLocal 原理等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 一篇文章帶你理解Java的SPI機(jī)制(圖文并茂)

    一篇文章帶你理解Java的SPI機(jī)制(圖文并茂)

    本文詳細(xì)介紹了Java的SPI機(jī)制,包括其定義、用途和實(shí)現(xiàn)方式,SPI(ServiceProviderInterface)是一種服務(wù)發(fā)現(xiàn)機(jī)制,用于實(shí)現(xiàn)框架或庫(kù)的擴(kuò)展點(diǎn),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • 淺析Java中print、printf、println的區(qū)別

    淺析Java中print、printf、println的區(qū)別

    以下是對(duì)Java中print、printf、println的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • MyBatis-Plus聯(lián)表查詢(xún)以及分頁(yè)代碼實(shí)例

    MyBatis-Plus聯(lián)表查詢(xún)以及分頁(yè)代碼實(shí)例

    在開(kāi)發(fā)中遇到了一個(gè)問(wèn)題,需要進(jìn)行聯(lián)表查詢(xún)并進(jìn)行分頁(yè),因?yàn)椴幌胱约簛?lái)寫(xiě)分頁(yè),所以還是依靠MybatisPlus來(lái)實(shí)現(xiàn)想要的功能,下面這篇文章主要給大家介紹了關(guān)于MyBatis-Plus聯(lián)表查詢(xún)以及分頁(yè)的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 詳解Java?ThreadPoolExecutor的拒絕策略

    詳解Java?ThreadPoolExecutor的拒絕策略

    這篇文章主要介紹了Java?ThreadPoolExecutor的拒絕策略,本文對(duì)于線程的池的幾種策略進(jìn)行詳細(xì)的講解,在實(shí)際的生產(chǎn)中需要集合相關(guān)的場(chǎng)景來(lái)選擇合適的拒絕策略,需要的朋友可以參考下
    2022-08-08
  • 解決Spring Boot 多模塊注入訪問(wèn)不到j(luò)ar包中的Bean問(wèn)題

    解決Spring Boot 多模塊注入訪問(wèn)不到j(luò)ar包中的Bean問(wèn)題

    這篇文章主要介紹了解決Spring Boot 多模塊注入訪問(wèn)不到j(luò)ar包中的Bean問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Mybatis使用update更新值為null時(shí)不生效問(wèn)題解決

    Mybatis使用update更新值為null時(shí)不生效問(wèn)題解決

    這篇文章主要介紹了Mybatis使用update更新值為null時(shí)不生效問(wèn)題解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • MyBatis-Plus枚舉和自定義主鍵ID的實(shí)現(xiàn)步驟

    MyBatis-Plus枚舉和自定義主鍵ID的實(shí)現(xiàn)步驟

    這篇文章主要給大家介紹了關(guān)于MyBatis-Plus枚舉和自定義主鍵ID的相關(guān)資料,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • 推薦幾款非常實(shí)用的IDEA插件小結(jié)

    推薦幾款非常實(shí)用的IDEA插件小結(jié)

    這篇文章主要介紹了推薦幾款非常實(shí)用的IDEA插件小結(jié),解決你開(kāi)發(fā)中可望而又不好找的插件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • SpringBoot注冊(cè)FilterRegistrationBean相關(guān)情況講解

    SpringBoot注冊(cè)FilterRegistrationBean相關(guān)情況講解

    這篇文章主要介紹了SpringBoot注冊(cè)FilterRegistrationBean相關(guān)情況,借助FilterRegistrationBean來(lái)注冊(cè)filter,可以避免在web.xml種配置filter這種原始的寫(xiě)法
    2023-02-02

最新評(píng)論

黔西| 澎湖县| 梅州市| 宜兰市| 疏附县| 龙岩市| 三门峡市| 辽宁省| 衡南县| 乌拉特后旗| 遵义县| 焉耆| 武宁县| 苍溪县| 水富县| 唐海县| 庄河市| 离岛区| 新巴尔虎右旗| 东光县| 闻喜县| 分宜县| 体育| 东城区| 泸溪县| 新邵县| 鹿泉市| 临朐县| 洪洞县| 高要市| 天门市| 苍山县| 苍南县| 车险| 郓城县| 大港区| 三门县| 健康| 元谋县| 宁化县| 永靖县|