偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開(kāi)發(fā) 前端
最近接手了一個(gè)老項(xiàng)目,“愉悅的心情”自然無(wú)以言表,做開(kāi)發(fā)的朋友都懂,這里就不多說(shuō)了,都是淚圖片...

[[434970]]

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

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

  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> 

 

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

錯(cuò)誤的改造方式

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

  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,并且把第一個(gè) name 查詢(xún)中的 and 去掉了,以防 SQL 查詢(xún)報(bào)錯(cuò)。

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

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

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

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

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

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

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

  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> 

代碼改造完成之后,接下來(lái)我們來(lái)測(cè)試一下所有的請(qǐng)求場(chǎng)景。

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

此時(shí)我們可以不傳遞任何參數(shù)(查詢(xún)所有數(shù)據(jù)),如下圖所示:圖片生成的 SQL 語(yǔ)句如下:圖片

傳遞 1 個(gè)參數(shù)的請(qǐng)求

也可以傳遞 1 個(gè)參數(shù),根據(jù) name 進(jìn)行查詢(xún),如下圖所示:圖片生成的 SQL 如下圖所示:圖片也可以只根據(jù) password 進(jìn)行查詢(xún),如下圖所示:圖片生成的 SQL 如下圖所示:

傳遞 2 個(gè)參數(shù)的請(qǐng)求

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

生成的 SQL 如下圖所示:

用法解析

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

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

總結(jié)

在 MyBatis 中,建議盡量避免使用無(wú)意義的 SQL 拼接 where 1=1,我們可以使用標(biāo)簽來(lái)替代 where 1=1,這樣的寫(xiě)既簡(jiǎn)潔又優(yōu)雅,何樂(lè)而不為呢?

 

責(zé)任編輯:武曉燕 來(lái)源: Java中文社群
相關(guān)推薦

2024-02-20 22:13:49

SQL語(yǔ)句編程

2024-03-11 11:02:03

Date類(lèi)JavaAPI

2020-12-01 09:55:48

M1芯片MacBook

2020-12-15 10:00:31

MySQL數(shù)據(jù)庫(kù)text

2010-09-08 15:51:53

SQL語(yǔ)句where

2025-09-15 01:50:00

2011-03-10 13:18:54

SQLwhere

2024-07-29 08:20:10

2020-11-17 09:01:09

MySQLDelete數(shù)據(jù)

2020-12-22 06:04:13

Python定時(shí)代碼

2020-12-24 18:46:11

Java序列化編程語(yǔ)言

2021-08-04 17:20:30

阿里巴巴AsyncJava

2021-10-13 14:06:46

MySQLUtf8符號(hào)

2020-04-01 17:50:02

Python編程語(yǔ)言

2020-06-23 14:09:49

枚舉JDK場(chǎng)景

2025-04-29 07:06:20

2024-02-28 07:37:53

JavaExecutors工具

2021-01-26 21:00:24

SSL證書(shū)網(wǎng)絡(luò)安全加密

2021-07-01 16:10:22

equals字符串Java

2022-02-06 10:58:37

Redis主從模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)