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

Mybatis中where標簽與if標簽結(jié)合使用詳細說明

 更新時間:2023年03月03日 09:34:56   作者:鱷魚兒  
mybatis中if和where用于動態(tài)sql的條件拼接,在查詢語句中如果缺失某個條件,通過if和where標簽可以動態(tài)的改變查詢條件,下面這篇文章主要給大家介紹了關(guān)于Mybatis中where標簽與if標簽結(jié)合使用的詳細說明,需要的朋友可以參考下

前言

由于不小心將and或者or寫在了語句后面,導(dǎo)致mybatis無法自主判別,這種問題在新上手的同學(xué)中很是常見。下面我們探討一下,在哪些情況下Mybatis無法判斷動態(tài)SQL語句中的and或者or。

使用<where>標簽

select篩選出視圖對象的參數(shù),用于給前端返回頁面參數(shù)使用。

	<sql id="selectFileVo">
        select file_id,
               uuid,
               file_name,
               file_url,
               status,
               create_time,
               update_time
        from file
    </sql>

以下代碼格式是正確,我們先觀察下and或者or的位置。

    <select id="selectFileList" parameterType="File" resultMap="FileResult">
        <include refid="selectFileVo"/>
        <where>
            <if test="fileName != null  and fileName != ''">
                and file_name like concat('%', #{fileName}, '%')
            </if>
            <if test="status != null  and status != ''">
                and status = #{status}
            </if>
            <if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
                and create_time between #{params.beginCreateTime} and #{params.endCreateTime}
            </if>
        </where>
    </select>

再看一下錯誤的寫法;

    <select id="selectFileList" parameterType="File" resultMap="FileResult">
        <include refid="selectFileVo"/>
        <where>
            <if test="fileName != null  and fileName != ''">
                file_name like concat('%', #{fileName}, '%') and
            </if>
            <if test="status != null  and status != ''">
                status = #{status} and 
            </if>
            <if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
                create_time between #{params.beginCreateTime} and #{params.endCreateTime}
            </if>
        </where>
    </select>

這時候運行該代碼,當beginCreateTimeendCreateTime為空時,我們會發(fā)現(xiàn)報錯SQL執(zhí)行異常,原因是where多了一個and。

總結(jié)

<if>標簽判斷失敗后, <where> 標簽關(guān)鍵字可以自動去除掉庫表字段賦值前面的and,不會去掉語句后面的and關(guān)鍵字,即<where> 標簽只會去掉<if> 標簽語句中的最開始的and關(guān)鍵字。所以上面的寫法(and寫在后面)是不符合mybatis規(guī)范的。

不使用<where>標簽

當不使用<where>標簽時,正確的寫法可以參考以下代碼:

<select id="selectFileList" parameterType="File" resultMap="FileResult">
        <include refid="selectFileVo"/>
        where 1=1 
        <if test="fileName != null  and fileName != ''">
            and file_name like concat('%', #{fileName}, '%')
        </if>
        <if test="status != null  and status != ''">
            and status = #{status}
        </if>
        <if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
            and create_time between #{params.beginCreateTime} and #{params.endCreateTime}
        </if>
    </select>

此時我們發(fā)現(xiàn)and是寫在前面的,同時增加了1=1條件。

如果我們?nèi)サ?code>1=1條件,同時去掉第一個<if>標簽的and

<select id="selectFileList" parameterType="File" resultMap="FileResult">
        <include refid="selectFileVo"/>
        where 
        <if test="fileName != null  and fileName != ''">
            file_name like concat('%', #{fileName}, '%')
        </if>
        <if test="status != null  and status != ''">
            and status = #{status}
        </if>
        <if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
            and create_time between #{params.beginCreateTime} and #{params.endCreateTime}
        </if>
    </select>

這種情況下,當fileName為空時,sql語句中會出現(xiàn)where and這種錯誤的語法,最終導(dǎo)致sql執(zhí)行異常。所以正確的代碼中,使用1=1條件,當fileName為空時,sql語句就會變成where 1=1 ,后面接不接and都能正確執(zhí)行。

在不使用<where>標簽的情況下,and寫在后面,在where條件最后增加1=1判斷,原理和上面一樣,這里就不再贅述了。

總結(jié)

到此這篇關(guān)于Mybatis中where標簽與if標簽結(jié)合使用的文章就介紹到這了,更多相關(guān)Mybatis使用where標簽與if標簽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一次Jvm old過高的排查過程實戰(zhàn)記錄

    一次Jvm old過高的排查過程實戰(zhàn)記錄

    這篇文章主要給大家介紹了一次Jvm old過高的排查過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 詳細介紹Java阿里云的短信驗證碼實現(xiàn)

    詳細介紹Java阿里云的短信驗證碼實現(xiàn)

    這篇文章主要介紹了詳細介紹Java阿里云的短信驗證碼實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • java遍歷機制性能的比較詳解

    java遍歷機制性能的比較詳解

    這篇文章主要給大家介紹了關(guān)于java遍歷機制性能比較的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Java實戰(zhàn)之醫(yī)院管理系統(tǒng)的實現(xiàn)

    Java實戰(zhàn)之醫(yī)院管理系統(tǒng)的實現(xiàn)

    這篇文章主要介紹了如何利用Java實現(xiàn)醫(yī)院管理系統(tǒng),文中用到的技術(shù)有:SpringBoot、Layui、Freemaker等,感興趣的同學(xué)可以了解一下
    2022-04-04
  • @Validated驗證List集合的方法示例

    @Validated驗證List集合的方法示例

    這篇文章主要介紹了@Validated驗證List集合的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • SpringBoot3各種配置的優(yōu)先級對比小結(jié)

    SpringBoot3各種配置的優(yōu)先級對比小結(jié)

    SpringBoot3提供了多種配置來源以滿足不同場景下的需求,本文詳細介紹了SpringBoot3中的配置優(yōu)先級對比小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2024-12-12
  • Spring Boot webflux使用方法解析

    Spring Boot webflux使用方法解析

    這篇文章主要介紹了Spring Boot webflux使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Java實現(xiàn)在線SQL編程最新完整版

    Java實現(xiàn)在線SQL編程最新完整版

    這篇文章主要介紹了Java實現(xiàn)在線SQL編程,在使用JDBC來進行數(shù)據(jù)庫的操作,在使用時由于對其方法并不是全部了解,所以需要邊看源碼邊改善功能,感興趣的朋友跟隨小編一起看看吧
    2022-06-06
  • Java自定義注解對枚舉類型參數(shù)的校驗方法

    Java自定義注解對枚舉類型參數(shù)的校驗方法

    文章介紹了如何使用Java注解對枚舉類型參數(shù)進行校驗,通過自定義注解和注解校驗類實現(xiàn)參數(shù)的靈活性校驗,感興趣的朋友一起看看吧
    2025-01-01
  • java的arrays數(shù)組排序示例分享

    java的arrays數(shù)組排序示例分享

    排序算法,基本的高級語言都有一些提供。C語言有qsort()函數(shù),C++有sort()函數(shù),java語言有Arrays類(不是Array)。用這些排序時,都可以寫自己的排序規(guī)則
    2014-02-02

最新評論

宜春市| 中阳县| 彰武县| 吉木萨尔县| 秦安县| 尚志市| 西平县| 化州市| 景洪市| 安岳县| 赤壁市| 桐乡市| 平谷区| 双鸭山市| 松江区| 巴里| 山阳县| 芦山县| 汝阳县| 浙江省| 新和县| 绥宁县| 中阳县| 炉霍县| 漳浦县| 乌恰县| 丹东市| 高平市| 井研县| 海城市| 贵阳市| 保定市| 兰考县| 梁河县| 常州市| 布拖县| 阜城县| 莆田市| 华阴市| 灌云县| 凤凰县|