<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近接手了一個老專案,“愉悅的心情”自然無以言表,做開發的朋友都懂,這裡就不多說了,都是淚...
接手老專案,自然是要先熟悉一下業務程式碼,然而在翻閱 mapper 檔案時,發現了一個比較詭異的事情。這裡給出簡化後的業務程式碼:
<?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 查詢時,結果如下:
一切順利成章,完美的一塌糊塗。
然而,當省略 name 引數時(因為 name 為非必要引數,所以可以省略),竟然引發了以下異常:
又或者只有 password 查詢時,結果也是一樣:
都是報錯資訊,那腫麼辦呢?難不成把 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>
程式碼改造完成之後,接下來我們來測試一下所有的請求場景。
此時我們可以不傳遞任何引數(查詢所有資料),如下圖所示:
生成的 SQL 語句如下:
也可以傳遞 1 個引數,根據 name 進行查詢,如下圖所示:
生成的 SQL 如下圖所示:
也可以只根據 password 進行查詢,如下圖所示:
生成的 SQL 如下圖所示:
也可以根據 name 加 password 的方式進行聯合查詢,如下圖所示:
生成的 SQL 如下圖所示:
我們驚喜的發現,在使用了 標籤之後,無論是任何查詢場景,傳一個或者傳多個引數,或者直接不傳遞任何引數,都可以輕鬆搞定。
首先, 標籤會判斷,如果沒有任何引數,則不會在 SQL 語句中拼接 where 查詢,反之才會拼接 where 查詢;其次在 查詢的 標籤中,每個 標籤都可以加 and 關鍵字,MyBatis 會自動將第一個條件前面的 and 關鍵字刪除掉,從而不會導致 SQL 語法錯誤,這一點官方檔案中也有說明,如下圖所示:
在 MyBatis 中,建議儘量避免使用無意義的 SQL 拼接 where 1=1,我們可以使用 標籤來替代 where 1=1,這樣的寫既簡潔又優雅,何樂而不為呢?以上內容僅為個人觀點,更多關於MyBatis不建議用where 1=1的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45