91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis中不建議使用where?1=1的原因是什么

發布時間:2022-09-23 16:19:28 來源:億速云 閱讀:148 作者:iii 欄目:開發技術

這篇文章主要介紹了MyBatis中不建議使用where 1=1的原因是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇MyBatis中不建議使用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 1=1
            <if test="name!=null">
                and name=#{name}
            </if>
            <if test="password!=null">
                and password=#{password}
            </if>
        </select>
    </mapper>

    機智的小伙伴可能已經看出了問題,在眾多 mapper 中發現了一個相同的想象,幾乎所有的 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 查詢報錯。

    但這樣就沒問題了嗎?我們直接來看結果,當包含參數 name 查詢時,結果如下:

    MyBatis中不建議使用where?1=1的原因是什么

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

    然而,當省略 name 參數時(因為 name 為非必要參數,所以可以省略),竟然引發了以下異常:

    MyBatis中不建議使用where?1=1的原因是什么

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

    MyBatis中不建議使用where?1=1的原因是什么

    都是報錯信息,那腫么辦呢?難不成把 1=1 恢復回去?

    正確的改進方式

    其實不用,在 MyBatis 中早已經想到了這個問題,我們可以將 SQL 中的 where 關鍵字換成 MyBatis 中的 標簽,并且給每個 標簽內都加上 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>

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

    不傳任何參數的請求

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

    MyBatis中不建議使用where?1=1的原因是什么

    生成的 SQL 語句如下:

    MyBatis中不建議使用where?1=1的原因是什么

    傳遞 1 個參數的請求

    也可以傳遞 1 個參數,根據 name 進行查詢,如下圖所示:

    MyBatis中不建議使用where?1=1的原因是什么

    生成的 SQL 如下圖所示:

    MyBatis中不建議使用where?1=1的原因是什么

    也可以只根據 password 進行查詢,如下圖所示:

    MyBatis中不建議使用where?1=1的原因是什么

    生成的 SQL 如下圖所示:

    MyBatis中不建議使用where?1=1的原因是什么

    傳遞 2 個參數的請求

    也可以根據 name 加 password 的方式進行聯合查詢,如下圖所示:

    MyBatis中不建議使用where?1=1的原因是什么

    生成的 SQL 如下圖所示:

    MyBatis中不建議使用where?1=1的原因是什么

    用法解析

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

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

    MyBatis中不建議使用where?1=1的原因是什么

    關于“MyBatis中不建議使用where 1=1的原因是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“MyBatis中不建議使用where 1=1的原因是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    鄱阳县| 上栗县| 襄垣县| 广平县| 双峰县| 化州市| 辰溪县| 清丰县| 仙游县| 浦江县| 甘南县| 台东县| 平远县| 七台河市| 额济纳旗| 房产| 郑州市| 武邑县| 东莞市| 含山县| 南江县| 玛曲县| 慈利县| 合江县| 乐都县| 邯郸县| 河东区| 漳浦县| 江陵县| 阿鲁科尔沁旗| 阿巴嘎旗| 瑞安市| 白城市| 蒙阴县| 赣榆县| 格尔木市| 澎湖县| 咸宁市| 通榆县| 龙胜| 黎川县|