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

MyBatis中不建議使用where?1=1原因詳解

 更新時間:2022年06月21日 17:11:32   作者:Java中文社群  
這篇文章主要為大家介紹了MyBatis中不建議使用where?1=1的原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

最近接手了一個老項(xiàng)目,“愉悅的心情”自然無以言表,做開發(fā)的朋友都懂,這里就不多說了,都是淚...

接手老項(xiàng)目,自然是要先熟悉一下業(yè)務(wù)代碼,然而在翻閱 mapper 文件時,發(fā)現(xiàn)了一個比較詭異的事情。這里給出簡化后的業(yè)務(wù)代碼:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="list" resultType="com.example.demo.model.User">
        select * from user
        where 1=1
        <if test="name!=null">
            and name=#{name}
        </if>
        <if test="password!=null">
            and password=#{password}
        </if>
    </select>
</mapper>

機(jī)智的小伙伴可能已經(jīng)看出了問題,在眾多 mapper 中發(fā)現(xiàn)了一個相同的想象,幾乎所有的 mapper 中都包含了一個無用的拼接 SQL:where 1=1。作為一個幾乎有代碼潔癖癥的人,自然是忍不住動手改造一番了。

錯誤的改造方式

既然是去掉 where 1=1,那最簡單的方式就是將它直接從代碼中刪除了,如下代碼所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="list" resultType="com.example.demo.model.User">
        select * from user
            where
            <if test="name!=null">
                name=#{name}
            </if>
            <if test="password!=null">
                and password=#{password}
            </if>
    </select>
</mapper>

以上代碼刪除了 1=1,并且把第一個 name 查詢中的 and 去掉了,以防 SQL 查詢報(bào)錯。

但這樣就沒問題了嗎?我們直接來看結(jié)果,當(dāng)包含參數(shù) name 查詢時,結(jié)果如下:

一切順利成章,完美的一塌糊涂。

然而,當(dāng)省略 name 參數(shù)時(因?yàn)?name 為非必要參數(shù),所以可以省略),竟然引發(fā)了以下異常:

又或者只有 password 查詢時,結(jié)果也是一樣:

都是報(bào)錯信息,那腫么辦呢?難不成把 1=1 恢復(fù)回去?

正確的改進(jìn)方式

其實(shí)不用,在 MyBatis 中早已經(jīng)想到了這個問題,我們可以將 SQL 中的 where 關(guān)鍵字換成 MyBatis 中的 標(biāo)簽,并且給每個 標(biāo)簽內(nèi)都加上 and 拼接符,這樣問題就解決了,如下代碼所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="list" resultType="com.example.demo.model.User">
        select * from user
        <where>
            <if test="name!=null">
               and name=#{name}
            </if>
            <if test="password!=null">
                and password=#{password}
            </if>
        </where>
    </select>
</mapper>

代碼改造完成之后,接下來我們來測試一下所有的請求場景。

不傳任何參數(shù)的請求

此時我們可以不傳遞任何參數(shù)(查詢所有數(shù)據(jù)),如下圖所示:

生成的 SQL 語句如下:

傳遞 1 個參數(shù)的請求

也可以傳遞 1 個參數(shù),根據(jù) name 進(jìn)行查詢,如下圖所示:

生成的 SQL 如下圖所示:

也可以只根據(jù) password 進(jìn)行查詢,如下圖所示:

生成的 SQL 如下圖所示:

傳遞 2 個參數(shù)的請求

也可以根據(jù) name 加 password 的方式進(jìn)行聯(lián)合查詢,如下圖所示:

生成的 SQL 如下圖所示:

用法解析

我們驚喜的發(fā)現(xiàn),在使用了 標(biāo)簽之后,無論是任何查詢場景,傳一個或者傳多個參數(shù),或者直接不傳遞任何參數(shù),都可以輕松搞定。

首先, 標(biāo)簽會判斷,如果沒有任何參數(shù),則不會在 SQL 語句中拼接 where 查詢,反之才會拼接 where 查詢;其次在 查詢的 標(biāo)簽中,每個 標(biāo)簽都可以加 and 關(guān)鍵字,MyBatis 會自動將第一個條件前面的 and 關(guān)鍵字刪除掉,從而不會導(dǎo)致 SQL 語法錯誤,這一點(diǎn)官方文檔中也有說明,如下圖所示:

總結(jié)

在 MyBatis 中,建議盡量避免使用無意義的 SQL 拼接 where 1=1,我們可以使用 標(biāo)簽來替代 where 1=1,這樣的寫既簡潔又優(yōu)雅,何樂而不為呢?以上內(nèi)容僅為個人觀點(diǎn),更多關(guān)于MyBatis不建議用where 1=1的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談JAVA工作流的優(yōu)雅實(shí)現(xiàn)方式

    淺談JAVA工作流的優(yōu)雅實(shí)現(xiàn)方式

    這篇文章主要介紹了淺談JAVA工作流的優(yōu)雅實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • java去除中文括號小括號,或者英文括號的實(shí)例代碼

    java去除中文括號小括號,或者英文括號的實(shí)例代碼

    這篇文章主要介紹了java去除中文括號小括號,或者英文括號的實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • redis做服務(wù)間通信工具的項(xiàng)目示例

    redis做服務(wù)間通信工具的項(xiàng)目示例

    Redis是一種高效的服務(wù)間通信工具,它以鍵值對的形式存儲數(shù)據(jù),并支持多種數(shù)據(jù)類型和豐富的操作,本文主要介紹了redis做服務(wù)間通信工具的項(xiàng)目示例,感興趣的可以了解一下
    2023-08-08
  • Java基于Spire Cloud Excel把Excel轉(zhuǎn)換成PDF

    Java基于Spire Cloud Excel把Excel轉(zhuǎn)換成PDF

    這篇文章主要介紹了Java基于Spire Cloud Excel把Excel轉(zhuǎn)換成PDF,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 使用MDC快速查詢應(yīng)用接口全部執(zhí)行日志

    使用MDC快速查詢應(yīng)用接口全部執(zhí)行日志

    這篇文章主要為大家介紹了使用MDC快速查詢應(yīng)用接口全部執(zhí)行日志的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Mybatis-Plus中updateById方法不能更新空值問題解決

    Mybatis-Plus中updateById方法不能更新空值問題解決

    本文主要介紹了Mybatis-Plus中updateById方法不能更新空值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Spring中@Transactional用法詳細(xì)介紹

    Spring中@Transactional用法詳細(xì)介紹

    這篇文章主要介紹了Spring中@Transactional用法詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 支持生產(chǎn)阻塞的Java線程池

    支持生產(chǎn)阻塞的Java線程池

    在各種并發(fā)編程模型中,生產(chǎn)者-消費(fèi)者模式大概是最常用的了。在實(shí)際工作中,對于生產(chǎn)消費(fèi)的速度,通常需要做一下權(quán)衡
    2014-04-04
  • 基于Springboot實(shí)現(xiàn)定時發(fā)送郵件功能

    基于Springboot實(shí)現(xiàn)定時發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了基于Springboot實(shí)現(xiàn)定時發(fā)送郵件功能的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Java對類私有變量的暴力反射技術(shù)講解

    Java對類私有變量的暴力反射技術(shù)講解

    今天小編就為大家分享一篇關(guān)于Java對類私有變量的暴力反射技術(shù)講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論

枝江市| 云林县| 连南| 儋州市| 长阳| 皮山县| 张家界市| 类乌齐县| 两当县| 青川县| 朔州市| 涟源市| 禄劝| 黔西县| 岳西县| 古蔺县| 鄂尔多斯市| 九寨沟县| 和平区| 泊头市| 云安县| 华池县| 宁波市| 沈丘县| 监利县| 白水县| 噶尔县| 宁乡县| 巩义市| 三门峡市| 东乡县| 修水县| 白山市| 灵台县| 奉节县| 新余市| 门头沟区| 靖远县| 福泉市| 抚顺县| 贺州市|