簡述MyBatis中#{}引用和${}引用的區別

各位大佬光臨寒舍,希望各位能賞臉給個三連,謝謝各位大佬了!!!??

目錄

1.有無預編譯

優點

缺點

2.SQL執行的快慢

3.能否被SQL注入

4.參數輸入方式

5.總結


1.有無預編譯

#{}是有預編譯的而${}是沒有預編譯的,那什么是預編譯,預編譯又有什么優缺點呢?在了解這個之前,預編譯進行的步驟:

它會將SQL語法進行解析再進行SQL優化再進行編譯,最后才給到數據庫進行執行。

優點

但是當有多個SQL語句的時候,預編譯就會顯得很慢,所以預編譯的SQL會被加入到一個緩存區,當只有?處的參數變化時,會直接從緩存區中拿到SQL,讓SQL進行執行,這樣它的速度就會加快很多。并且執行了SQL優化后,SQL語句就不會因為SQL注入導致數據庫被破壞。

缺點

在執行多個不僅僅是參數不同的SQL時每次都需要重新預編譯,導致速度不如不預編譯的快。

2.SQL執行的快慢

就像上面說的有無預編譯的區別,#{}在執行多個僅在參數有所不同的SQL時僅僅在預編譯時進行編譯省去了SQL的編譯,執行效率就更高,而${}則只是一個字符串拼接,每次都要把SQL語句給到數據庫進行編譯處理再執行,對于多個僅在參數有所不同的SQL時效率低,而在不僅僅是參數不同的SQL語句中${}更加有效率。但是當今的項目大部分都是執行多個僅在參數有所不同的SQL,所以大部分情況都是#{}更有效率。

3.能否被SQL注入

因為#{}在預編譯階段就進行了SQL的優化,導致它不僅僅是SQL的拼接,而是替換?處的參數,所以它不能被SQL注入從而使數據庫受到損害。而${}只是對數據的單純拼接,所以它是會被SQL注入的,就比如以下語句:

@Select("select * from student1 where id<=${id}")public List<StudentInfo> getId(Integer id) ;

我們可以直接輸入以下內容來獲取所有的用戶信息

1 or 1=1

也可以輸入以下內容直接刪除數據庫

1;drop database mybatis;

?所以${}是比較危險的。

4.參數輸入方式

#{}會根據所對應的參數選擇加不加“”,如String類型就會加“”,而Integer類型就不會加引號。而${}在所有情況下都不會加引號。如圖:

#{}會進行參數帶入

${}直接以字符形勢加入字符,這時候就會報錯,外面需要自己在參數外加‘’

所以在一般情況下#{}方便很多,我們不需要在參數為String時外面添加引號,但是也有特殊情況,那就是我們需要String類型但是我們不想加引號,如自己選定降序,升序排序。但是我們又怕SQL注入,所以一般對于這種情況我們都會對前端或者后端做出交互限制,讓前端發送數字,或者后端把前端的字符轉成數字,再以鍵值對的形式輸入參數,這樣就算有別的數據也會被判定為不合法。

5.總結

總的來說,#{}的用途更加廣泛,也更加安全,它們倆的區別概括一下也就三個點:

1.#{}有預編譯${}無預編譯

2.#{}寫入參數是占位的方式不會被SQL注入,安全,${}是直接以字符的形式寫入參數,會被SQL注入,不安全。

3.一般情況的SQL#{}都能完成,但是對于一些特殊場景比如排序,字段名作為參數等情況需要使用${},但是也要注意使用方法。

這里其實還有一個就是模糊查詢,正常情況下需要用${},因為例如say like?'%hi%',這樣的查詢我們只能用'%${hi}%',這樣的形式來注入參數,而剛好MySQL有個concat拼接字符串的函數,所以我們可以直接使用concat來完成如 say like concat('%',#{hi},'%')。那我們今天就講到這吧。有到時候和各位說再見了。在這之前:

制作不易,望各位大佬賞個臉,給個三連吧!!謝謝各位大佬了!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13416.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13416.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13416.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LiveGBS流媒體平臺GB/T28181用戶手冊-服務器概覽:通道信息、負載信息、CPU使用、存儲使用、帶寬使用(Mbps)、內存使用

LiveGBS用戶手冊-服務器概覽&#xff1a;通道信息、負載信息、CPU使用、存儲使用、帶寬使用&#xff08;Mbps&#xff09;、內存使用 1、服務器概覽1.1、通道信息1.2、負載信息1.2.1、信息說明1.2.2、會話列表 1.3、CPU使用1.4、存儲使用1.5、帶寬使用&#xff08;Mbps&#xf…

15:00面試,15:08出來,面試問的有點變態。。。。

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 從小廠出來&#xff0c;沒想到在另一家公司又寄了。 到這家公司開始上班&#xff0c;加班是每天…

C語言查漏補缺學習【精簡版】

1.scanf函數 scanf&#xff08;"%d %d"&#xff09;//1 2 scanf("price%d %d") //price1 2 // 意思就是scanf函數中&#xff0c;格式是什么&#xff0c;就要對應的輸入什么&#xff0c;不然讀取不到輸入的變量2.常量&#xff1a;const int AMOUNT 100; …

github下載代碼

clone代碼 git clone https://<your_token>github.com//.git 設置URL git remote set-url origin https://<your_token>github.com//.git 設置github本地ip https://juejin.cn/post/7350880189836918820?searchId202405191828091DB64DD476DF0AEC7442

掌握Edge瀏覽器的使用技巧

導言&#xff1a; Edge瀏覽器是微軟推出的一款現代化、高效的網絡瀏覽器。它不僅提供了基本的瀏覽功能&#xff0c;還具備了許多強大的特性和技巧&#xff0c;可以幫助用戶更好地利用瀏覽器進行工作和娛樂。本文將介紹一些Edge瀏覽器的使用技巧&#xff0c;幫助讀者更好地掌握這…

阿里云數據庫 SelectDB 版全面商業化,開啟現代化實時數據倉庫的全新篇章

2024 年 5 月 21 日&#xff0c;由阿里云聯合飛輪科技共同舉辦的「阿里云數據庫 SelectDB 版商業化產品發布會」于線上召開。阿里巴巴集團副總裁、阿里云數據庫產品事業部負責人李飛飛宣布&#xff0c;阿里云數據庫 SelectDB 版在中國站及國際站全面發布&#xff0c;正式開啟商…

集合-1 數組ArrayListLinkedList

一.數組 1.什么是數組&#xff1f; 數組是一種用連續的內存空間存儲相同類型數據的線性數據結構。 2.為什么數組下標是從0開始&#xff1f; &#xff08;1&#xff09;數組根據下標查找元素是基于尋址公式&#xff1a;元素地址數組首地址索引i*數組存儲數據類型的大小 &am…

ROS | 用C++和python實現運動控制功能

基礎知識&#xff1a; 用C實現&#xff1a; C代碼&#xff1a; 用python實現&#xff1a; Python代碼&#xff1a;

數據庫理論基本概念

數據庫理論基本概念 三級模式和兩級映像 外模式 > 用戶和數據庫系統的接口 -------- 外模式-概念模式映射 概念模式 > 數據的邏輯結構和特征的描述 -------- 概念模式-內模式映射 內模式 > 數據物理結構和存儲方式的描述三級…

避雷:搭建ai知識庫的6大注意事項

隨著人工智能技術的發展&#xff0c;ai知識庫成為眾多企業追求的一個重要部分&#xff0c;幫助企業提高運營次效率&#xff0c;越來越受到人們的關注。但是&#xff0c;在搭建ai知識庫的過程中&#xff0c;稍不留意&#xff0c;就會漏掉一些小細節&#xff0c;導致做出來的ai知…

【LeetCode】438.找到字符串中所有字母異位詞

找到字符串中所有字母異位詞 題目描述&#xff1a; 給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 異位詞 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示…

Scala學習筆記4: 數組

目錄 第四章1- 定長數組2- 變長數組3- 遍歷數組和數組緩存4- 數組轉換5- 常用算法6- 多維數組end 第四章 1- 定長數組 在Scala中, 定長數組可以使用 Array 類來創建; 定長數組在創建時需要指定數組的長度, 并且長度在整個數組生命周期中保持不變; 示例: // 定義一個定長數組…

GPT-4o 引領人機交互新風向的向量數據庫Milvus Cloud 成本

成本 AIGC 時代對于冷熱儲存的呼喚 成本一直是向量數據庫獲得更廣泛使用的最大阻礙之一,這個成本來自兩點: 儲存,絕大多數向量數據庫為了保證低延遲,需要把數據全量緩存到內存或者本地磁盤。在這個動輒百億量級的AI 時代,意味著幾十上百 TB 的資源消耗。 計算,數據需…

OpenFeign高級用法:緩存、QueryMap、MatrixVariable、CollectionFormat優雅地遠程調用

碼到三十五 &#xff1a; 個人主頁 微服務架構中&#xff0c;服務之間的通信變得尤為關鍵。OpenFeign&#xff0c;一個聲明式的Web服務客戶端&#xff0c;使得REST API的調用變得更加簡單和優雅。OpenFeign集成了Ribbon和Hystrix&#xff0c;具有負載均衡和容錯的能力&#xff…

線性回歸模型之套索回歸

概述 本案例是基于之前的嶺回歸的案例的。之前案例的完整代碼如下&#xff1a; import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import Ridge, LinearRegression from sklearn.datasets import make_regression from sklearn.model_selectio…

NegativePrompt:利用心理學通過負面情緒刺激增強大型語言模型

【摘要】大型語言模型 (LLM) 已成為各種應用不可或缺的一部分&#xff0c;從傳統的計算任務到高級人工智能 (AI) 應用。這種廣泛的應用促使社會科學等各個學科對 LLM 進行了廣泛的研究。值得注意的是&#xff0c;研究表明 LLM 具有情商&#xff0c;可以通過積極的情緒刺激進一步…

C++:深入理解多態

一、多態的概念 多態的概念&#xff1a;通俗來說&#xff0c;就是多種形態&#xff0c;具體點就是去完成某個行為&#xff0c;當不同的對象去完成時會產生出不同的狀態。 那究竟多態的實際價值體現在哪里呢&#xff1f;&#xff1f; 1、舉個例子比如說購買高鐵票這個行為&…

Spring Boot | SpringBoot 中 自定義 “用戶授權管理“ : 自定義“用戶訪問控制“、自定義“用戶登錄控制“

目錄: 一、SpringBoot 中 自定義 "用戶授權管理" ( 總體內容介紹 ) :二、 自定義 "用戶訪問控制" ( 通過 "HttpSecurity類" 的 authorizeRequests( )方法來實現 "自定義用戶訪問控制" ) :1.基礎項目文件準備2.實現 "自定義身份認…

4. 分布式鏈路追蹤客戶端工具包Starter設計

前言 本文將從零搭建分布式鏈路追蹤客戶端工具包的Starter&#xff0c;并將在后續文章中逐步豐富支持的場景。這里首先將搭建一個最基礎的Starter&#xff0c;能提供的功能和1. 看完這篇文章我奶奶都懂Opentracing了一文中的示例demo類似。 相關版本依賴如下。 opentracing-…

Scala學習2: 控制結構和函數

目錄 第二章 控制結構和函數1- 條件表達式2- 語句終止3- 塊表達式和賦值4- 輸入和輸出5- 循環6- 高級for循環和for推到式7- 函數8- 默認參數和帶名參數9- 可變參數10- 過程11- 懶值12- 異常end 第二章 控制結構和函數 1- 條件表達式 Scala的 if/esle 語法結構與java一樣, 但是…