mybatis 中 #{} 和 ${} 的區別及應用場景
一、#{} 和 ${} 詳解
動態 sql 是 mybatis 的主要特性之一,在 mapper 中定義的引數傳到 xml 中之後,在查詢之前 mybatis 會對其進行動態解析。mybatis 為我們提供了兩種支援動態 sql 的語法:#{} 以及 ${} 。
- #{} : 根據引數的型別進行處理,比如傳入String型別,則會為引數加上雙引號。#{} 傳參在進行SQL預編譯時,會把引數部分用一個佔位符 ? 代替,這樣可以防止 SQL注入。
- ${} : 將引數取出不做任何處理,直接放入語句中,就是簡單的字串替換,並且該引數會參加SQL的預編譯,需要手動過濾引數防止 SQL注入。
因此 mybatis 中優先使用 #{};當需要動態傳入 表名或列名時,再考慮使用 ${} 。
其中 ${} 比較特殊, 他的應用場景是 需要動態傳入 表名或列名時使用。下面舉例
二、應用場景
- 看下面的SQL語句, 功能是查出年齡使用 IN 運算子,姓名採用模糊查詢的一些男生,按照出生時間降序排列。但是下面這程式碼是達不到需求的,讀者可以自己先找找問題。
<!-- 條件查詢 -->
<select id="getList" resultType="com.ccyang.UserDao">
select
u.user_id, u.user_name, u.user_type, u.age, u.sex, u.birthday
from
user u
<where >
u.user_age in <foreach collection="ages" item="item" index="index" open="(" separator="," close=")">#{item}</foreach>
and u.sex == "男"
<if test="u.user_name != null and u.user_name != ''"> AND u.user_name like CONCAT(CONCAT('%', #{userName}), '%')</if >
<if test="order_by!= null and order_by != ''"> order by #{order_by} DESC</if>
</where>
</select>
上面這段程式碼可以查出資料,但是根據業務來看是有問題的,他不能進行排序,因為 #{birthday} 解析出來後是一個 帶著雙引號的字串,mysql找不到這樣的列名,因此不能進行排序。
2. 正確的寫法應該是使用 ${order_by},這樣解析後就是一個列名,然後才能對資料進行排序,已達到業務需求。
<!-- 條件查詢 -->
<select id="getList" resultType="com.ccyang.UserDao">
select
u.user_id, u.user_name, u.user_type, u.age, u.sex, u.birthday
from
user u
<where>
u.user_age in <foreach collection="ages" item="item" index="index" open="(" separator="," close=")">#{item}</foreach>
and u.sex == "男"
<if test="u.user_name != null and u.user_name != ''"> AND u.user_name like CONCAT(CONCAT('%', #{userName}), '%')</if>
<if test="order_by!= null and order_by != ''"> order by ${order_by} DESC</if>
</where>
</select>
使用 ${} 動態傳入表名或列名就可以達到需求,但是要小心SQL注入問題。
相關推薦
mybatis 中 #{} 和 ${} 的區別及應用場景
一、#{} 和 ${} 詳解 動態 sql 是 mybatis 的主要特性之一,在 mapper 中定義的引數傳到 xml 中之後,在查詢之前 mybatis 會對其進行動態解析。mybatis 為我們提供了兩種支援動態 sql 的語法:#{} 以及 ${}
淺談session,cookie,sessionStorage,localStorage的區別及應用場景
text 響應 font 會話 安全 path 時間 mage 路徑 瀏覽器的緩存機制提供了可以將用戶數據存儲在客戶端上的方式,可以利用cookie,session等跟服務端進行數據交互。 一、cookie和session cookie和session都是用來跟蹤瀏覽器用戶
關於debounce和throttle的區別及應用場景
scroll NPU str win 兩種 區別 個人 沒有 tro 電梯超時 想象每天上班大廈底下的電梯。把電梯完成一次運送,類比為一次函數的執行和響應。假設電梯有兩種運行策略 `throttle` 和 `debounce` ,超時設定為15秒,不考慮容量限制。 thro
[轉] 淺談session,cookie,sessionStorage,localStorage的區別及應用場景
class 包含 壓力 web 過期 ext 存在 bsp 開發者 瀏覽器的緩存機制提供了可以將用戶數據存儲在客戶端上的方式,可以利用cookie,session等跟服務端進行數據交互。 一、cookie和session cookie和session都是用來跟蹤瀏覽器用
session,cookie,sessionStorage,localStorage的區別及應用場景
加密 fcc 依然 就是 概念 客戶 web 應用場景 生命 session,cookie,sessionStorage,localStorage的區別及應用場景 瀏覽器的緩存機制提供了可以將用戶數據存儲在客戶端上的方式,可以利用cookie,session等跟服
String、StringBuffer與StringBuilder的區別及應用場景
1 String、StringBuffer與StringBuilder區別 (1)區別 String內容不可變,StringBuffer和StringBuilder內容可變; StringBuilder非執行緒安全(單執行緒使用),String與StringBuffer執行緒安全(多執
Mybatis和Hibernate區別和應用場景
hibernate: 是一個標準的ORM框架(物件關係對映)。入門門檻較高,不需要程式寫sql語句,sql語句自動生產了。 特點: 對sql的優化比較困難。 Hibernate對物件的維護和快取要比MyBatis好,對增刪改查的物件的維護要方便。 Hibernate資料庫移植性很好,MyB
淺談session,cookie,sessionStorage,localStorage的區別及應用場景 淺談session,cookie,sessionStorage,localStorage的區別及應用場景
轉載自 cencenyue 淺談session,cookie,sessionStorage,localStorage的區別及應用場景 瀏覽器的快取機制提供了可以將使用者資料儲存在客戶端上的方式,可以利用cookie,session等跟
TCP和UDP的區別及應用場景
面試題回答: TCP和UDP的區別 (1)TCP是面向連線的,udp是無連線的即傳送資料前不需要先建立連結。 (2)TCP提供可靠的服務。也就是說,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付。 並且因為tcp可靠,面向連線,不會丟
StringUtils.isEmpty與StringUtils.isBlank的區別及應用場景
由下面寫的一個簡單測試類中可以看出: StringUtils.isEmpty是判斷字串為null,空字串時為空,其餘情況包括含空格的空字串都可視為不為空 StringUtils.isBlank是判斷字串為null,空字串或字元的長度為零時為空,其餘情況不為空。 if(St
悲觀鎖和樂觀鎖的區別及應用場景
資料的鎖定分為兩種,第一種叫作悲觀鎖,第二種叫作樂觀鎖。 1、悲觀鎖,就是對資料的衝突採取一種悲觀的態度,也就是說假設資料肯定會衝突,所以在資料開始讀取的時候就把資料鎖定住。【資料鎖定:資料將暫時不會得到修改】 2、樂觀鎖,認為資料一般情況下不會造成衝突,所以在資料進行提交
抽象類和介面區別及應用場景
區別如下: 1.抽象類是對類的抽象(包括了屬性和對應的行為). 介面是對某一個行為動作的抽象。 2.抽象類只能單繼承,介面可以實現多繼承。 3.介面中定義的方法不能實現,即使不顯示的將方法宣告為public,他們也是 public。 抽象類中的方法可以
SSM框架中註解含義及應用場景小結
先說一下什麼是元件掃描: 指定一個包路徑,Spring會自動掃描該包及其子包所有元件類,當發現元件類定義前有特定的註解標記時,就將該元件納入到Spring容器。等價於原有XML配置中的<bean>定義功能。 元件掃描可以替代大量XML配置的<bea
String,StringBuffer與StringBuilder的區別及應用場景
String 字串常量 StringBuffer 字串變數(執行緒安全) StringBuilder 字串變數(非執行緒安全) 深入說明 簡要的說, String 型別和 StringBuffer 型別的主要效能區別其實在於 String 是不可變的物件, 因此
MySql兩種儲存引擎的區別及應用場景
MySql主要有兩種儲存引擎:InnoDB和MyISAM。應用場景:1).MyISAM管理非事務表。它提供高速儲存和檢索,以及全文搜尋能力。如果應用中需要執行大量的SELECT查詢,那麼MyISAM是更好的選擇。2).InnoDB用於事務處理應用程式,具有眾多特性,包括ACI
Sql語句中IN和exists的區別及應用
應用場景 將不 集中 pre 代碼 根據 gif 效率 .cn 表展示 首先,查詢中涉及到的兩個表,一個user和一個order表,具體表的內容如下: user表: order表: in 確定給定的值是否與子查
Hibernate中getCurrentSession()與openSession()的區別及應用
rop 綁定 cto 關閉 hiberna code pre thread 線程 獲取openSession和CurrentSession: session=HibernateSessionFactory.getSession(); session=HibernateSes
Oracel資料庫中檢視與同義詞的理解及應用場景
轉載至: https://blog.csdn.net/u012411219/article/details/51321162 1. 資料庫物件之【檢視】簡單介紹 1.1 What:什麼叫檢視?
MySQL資料庫中 InnoDB 與 MyISAM的區別及其應用場景
InnoDB 與 MyISAM 都是MySQL資料庫的引擎。 1.他們的區別分為五點: (1).事務處理: MyISAM是非事務安全型的,而InnoDB是事務安全型的(支援事務處理等) (2).鎖機制不同: MyISAM是
面試被問之-----sql優化中in與exists的區別 Mysql中 in or exists not exists not in區別 (網路整理) Sql語句中IN和exists的區別及應用 [筆記] SQL效能優化 - 避免使用 IN 和 NOT IN
曾經一次去面試,被問及in與exists的區別,記得當時是這麼回答的:''in後面接子查詢或者(xx,xx,xx,,,),exists後面需要一個true或者false的結果",當然這麼說也不算錯,但別人想聽的是sql優化相關,肯定是效率的問題,只是那個時候確實不知道它們在sql優化上的區別,只知道用in會進