成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MyBatis 中為什么不建議使用 Where 1=1?

開發 前端
最近接手了一個老項目,“愉悅的心情”自然無以言表,做開發的朋友都懂,這里就不多說了,都是淚圖片...

[[434970]]

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

接手老項目,自然是要先熟悉一下業務代碼,然而在翻閱 mapper 文件時,發現了一個比較詭異的事情。這里給出簡化后的業務代碼:

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

 

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

錯誤的改造方式

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

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

 

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

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

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

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

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

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

正確的改進方式

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

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

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

不傳任何參數的請求

此時我們可以不傳遞任何參數(查詢所有數據),如下圖所示:圖片生成的 SQL 語句如下:圖片

傳遞 1 個參數的請求

也可以傳遞 1 個參數,根據 name 進行查詢,如下圖所示:圖片生成的 SQL 如下圖所示:圖片也可以只根據 password 進行查詢,如下圖所示:圖片生成的 SQL 如下圖所示:

傳遞 2 個參數的請求

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

生成的 SQL 如下圖所示:

用法解析

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

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

總結

在 MyBatis 中,建議盡量避免使用無意義的 SQL 拼接 where 1=1,我們可以使用標簽來替代 where 1=1,這樣的寫既簡潔又優雅,何樂而不為呢?

 

責任編輯:武曉燕 來源: Java中文社群
相關推薦

2024-02-20 22:13:49

SQL語句編程

2024-03-11 11:02:03

Date類JavaAPI

2020-12-01 09:55:48

M1芯片MacBook

2020-12-15 10:00:31

MySQL數據庫text

2010-09-08 15:51:53

SQL語句where

2011-03-10 13:18:54

SQLwhere

2020-11-17 09:01:09

MySQLDelete數據

2024-07-29 08:20:10

2021-08-04 17:20:30

阿里巴巴AsyncJava

2021-10-13 14:06:46

MySQLUtf8符號

2020-12-24 18:46:11

Java序列化編程語言

2020-12-22 06:04:13

Python定時代碼

2020-04-01 17:50:02

Python編程語言

2020-06-23 14:09:49

枚舉JDK場景

2025-04-29 07:06:20

2024-02-28 07:37:53

JavaExecutors工具

2022-02-06 10:58:37

Redis主從模式

2021-07-01 16:10:22

equals字符串Java

2021-01-26 21:00:24

SSL證書網絡安全加密

2021-03-10 09:40:50

Linux命令文件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品国产99国产精品 | 欧美一区二区三区在线观看 | 久久专区 | 91在线观看免费视频 | 欧美美女一区二区 | 亚洲3p| 久久久婷 | 久久精品欧美一区二区三区不卡 | 国产亚洲精品精品国产亚洲综合 | 福利视频一区 | 粉嫩在线 | 欧美精品成人一区二区三区四区 | 99re6在线视频 | 国产黄色在线观看 | 欧美久久久电影 | 国产精品久久欧美久久一区 | 国产男人的天堂 | 国产精品一区一区 | 午夜免费视频 | 九九99精品 | 欧美电影一区 | 日韩一区二区在线免费观看 | 999精品在线观看 | 日本一区二区高清视频 | 一区二区在线免费播放 | 亚洲天堂成人在线视频 | 亚洲一区二区三区在线免费 | 男女免费网站 | 一级h片| 欧美一级片 | 麻豆毛片| 日韩a| 成人午夜视频在线观看 | 99久久精品免费看国产高清 | 日韩一区二区av | 亚洲少妇综合网 | 三级特黄特色视频 | 精品视频99 | 国产yw851.c免费观看网站 | 亚洲精品乱码久久久久久蜜桃91 | 亚洲伊人久久综合 |