1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        SQL中為什么不要使用1=1?

        共 3970字,需瀏覽 8分鐘

         ·

        2024-08-19 07:40

        閱讀本文大概需要 4 分鐘。

        來自:

        推薦一個程序員編程資料站:
        http://cxyroad.com

        2024年IDEA最新激活方法
        后臺回復(fù):激活碼

        CSDN免登錄復(fù)制代碼插件下載:
        CSDN復(fù)制插件

        以下是正文。




        在工作中的老項目中經(jīng)常會看到代碼中使用了1=1的情況,想起來之前自己也這個樣子寫過,感覺也沒有啥影響就沒有當回事,隨著工作年限,工作經(jīng)驗的增加,對著一塊有了更深的理解,下面我們就來看一看
        代碼開發(fā)中,編寫SQL語句其實就和家常炒菜差不多,每個條件語句就是一個調(diào)料,所以每一種調(diào)料都會影響菜的味道,對于SQL來說查詢條件的增加,影響的就是執(zhí)行SQL的效率。那么1=1這種為什么又會存在呢,存在即有它的道理,下面我們更深一層次的分析一下。
        為什么會使用 1=1?
        Java代碼開發(fā)中,使用最多的 Mybatis框架,在判斷條件的時候,會在條件前面增加AND連接,而有的條件不需要拼接,所以為了第一個條件是否要帶AND連接符,出現(xiàn)了始終為真的1=1的條件。
        就像下邊這樣:

        SELECT
          *
        FROM
          table
        WHERE
          1 = 1 < if test = 'username != null' >
          AND username = # { username } < / if > < if test = 'age > 0' >
          AND age = # { age } < / if >

        這樣就不用在增加每個條件之前先判斷是否需要添加“AND”。
        1=1 帶來的問題
        性能問題?
        對于數(shù)據(jù)庫的查詢優(yōu)化器了解的就會知道,其實寫了1=1這種條件,在SQL語句經(jīng)過優(yōu)化器的時候也會被優(yōu)化掉,但是對于不同的數(shù)據(jù)庫就有了不同的結(jié)果。另一個點就是如果都是1=1,沒有進行優(yōu)化,相當于把表中的全部數(shù)據(jù)都要進行一遍循環(huán),判斷一下這個毫無用處的條件是否滿足。
        查詢優(yōu)化器就相當于是個圖書管理員,他知道如何最快的查找到你所需要的書,當你告訴它你所需要的書的特征之后,他會根據(jù)這些信息選擇一個最快定位到該圖書的方式路徑。
        但是如果我們告訴它一些無關(guān)緊要的信息,這不就相當于廢話了嗎,加密??哈哈哈哈哈想起來廢話文學(xué)了,聽君一席話,勝聽一席話啊。所以說的多不一定有用,只需要把關(guān)鍵信息提供出來就可以。一個帶有“1=1”的查詢可能就相當與讓圖書管理員一本書一本書的去比較來檢查是不是你所需要的,顯然這是不合理的。
        你可能會說:數(shù)據(jù)庫沒有這么傻吧?
        確實,數(shù)據(jù)庫不會這點都沒做好。數(shù)據(jù)庫在執(zhí)行查詢的時候都會把這種1=1的始終為真的條件進行優(yōu)化掉,對于數(shù)據(jù)庫的性能也不會收到太多的影響。但是優(yōu)化器也不是萬能的,在個別的場景中還是有可能會造成全表掃描的,所以我們還是要避免的。
        代碼質(zhì)量
        在代碼質(zhì)量的角度來看,我們也是需要避免“1=1”這種寫法的,可以從以下幾點來考慮:
        • 代碼清晰性: 在復(fù)雜的SQL中,避免“1=1”這種引起歧義。
        • 習(xí)慣: 代碼規(guī)范。
        • 兼容: 跨數(shù)據(jù)的兼容性。避免有的數(shù)據(jù)庫無法進行優(yōu)化掉“1=1”這種條件造成的全表掃描。
        編寫盡可能高效、清晰和準確的SQL語句,不僅有助于保持代碼的質(zhì)量,也讓代碼具有更好的可維護性和可擴展性。
        替代 1=1 的更佳做法
        在代碼開發(fā)中,使用MyBatis框架的居多,所以我們可以使用Where標簽來進行優(yōu)化SQL寫法。
        假設(shè)我們有一個用戶信息表 user,并希望根據(jù)傳入的參數(shù)動態(tài)地過濾用戶。
        首先是Mybatis:

        <!-- MyBatis映射文件片段 -->
        <select id='selectUsersByConditions' parameterType='map' resultType='com.example.User'>
          SELECT * FROM user
        <where>
        <!-- 使用if標簽動態(tài)添加條件 -->
        <if test='username != null and username != '''>
              AND username = #{username}
        </if>
        <if test='age > 0'>
              AND age = #{age}
        </if>
        <!-- 更多條件... -->
        </where>
        </select>

        在 MyBatis 中,避免使用 1=1 的典型方法是利用動態(tài)SQL標簽(如 <if>)來構(gòu)建條件查詢。<where> 標簽會自動處理首條條件前的 AND 或 OR。當沒有滿足條件的 <if> 或其他條件標簽時,<where> 標簽內(nèi)部的所有內(nèi)容都會被忽略,從而不會生成多余的 AND 或 WHERE 子句。
        再看看 Entity Framework 的方法:

        var query = context.User.AsQueryable();
        if (!string.IsNullOrEmpty(username))
        {
            query = query.Where(b => b.UserName.Contains(username));
        }
        if (age>0)
        {
            query = query.Where(b => b.Age = age);
        }
        var users = query.ToList();

        這是一種函數(shù)式編程的寫法,最終生成SQL時,框架會決定是否在條件前增加AND,而不需要人為的增加 1=1。
        總結(jié)
        “1=1”在SQL語句中可能看起來無害,但實際上它是一種不良的編程習(xí)慣,可能會導(dǎo)致性能下降。就像在做飯時不會無緣無故地多加調(diào)料一樣,我們在編寫SQL語句時也應(yīng)該避免添加無意義的條件。
        每一行代碼都應(yīng)該有它存在的理由,不要讓人和數(shù)據(jù)庫浪費時間在不必要的事情上。

        <END>

        推薦閱讀:

        Facebook為什么要棄用Git?

        Spring-Security 認證流程分析及多方式登錄認證實踐

             
        程序員在線工具站:cxytools.com

        推薦一個自己寫的工具站:http://cxytools.com,專為程序員設(shè)計,包括時間日期、JSON處理、SQL格式化、隨機字符串生成、UUID生成、文本Hash...等功能,提升開發(fā)效率。

        ?戳閱讀原文直達!                                  朕已閱 

        瀏覽 112
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            凹凸日日摸日日碰夜夜爽孕妇 | 一级少妇婬高潮免费全看 | 久久免费看黄A级毛片暴力 | 俄罗斯美女一级爱片 | 在线观看视频免费黄 | 明兰乱淫h侵犯h文 | 爱爱午夜视频 | 国产伦子伦一级A片视 | 亚洲aⅴ | 处破初破苞一区二区三区最新章节 |