1. 程式人生 > >mybatis 中 #{} 和 ${} 的區別及應用場景

mybatis 中 #{} 和 ${} 的區別及應用場景

一、#{} 和 ${} 詳解

動態 sql 是 mybatis 的主要特性之一,在 mapper 中定義的引數傳到 xml 中之後,在查詢之前 mybatis 會對其進行動態解析。mybatis 為我們提供了兩種支援動態 sql 的語法:#{} 以及 ${} 。 

  • #{} : 根據引數的型別進行處理,比如傳入String型別,則會為引數加上雙引號。#{} 傳參在進行SQL預編譯時,會把引數部分用一個佔位符 ? 代替,這樣可以防止 SQL注入。
  • ${} : 將引數取出不做任何處理,直接放入語句中,就是簡單的字串替換,並且該引數會參加SQL的預編譯,需要手動過濾引數防止 SQL注入。
  • 因此 mybatis 中優先使用 #{};當需要動態傳入 表名或列名時,再考慮使用 ${} 。

  • 其中 ${} 比較特殊, 他的應用場景是 需要動態傳入 表名或列名時使用。下面舉例

二、應用場景

  1. 看下面的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都是用來跟蹤瀏覽器用戶

關於debouncethrottle的區別應用場景

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執行緒安全(多執

MybatisHibernate區別應用場景

hibernate: 是一個標準的ORM框架(物件關係對映)。入門門檻較高,不需要程式寫sql語句,sql語句自動生產了。 特點: 對sql的優化比較困難。 Hibernate對物件的維護和快取要比MyBatis好,對增刪改查的物件的維護要方便。 Hibernate資料庫移植性很好,MyB

淺談session,cookie,sessionStorage,localStorage的區別應用場景 淺談session,cookie,sessionStorage,localStorage的區別應用場景

 轉載自 cencenyue 淺談session,cookie,sessionStorage,localStorage的區別及應用場景 瀏覽器的快取機制提供了可以將使用者資料儲存在客戶端上的方式,可以利用cookie,session等跟

TCPUDP的區別應用場景

面試題回答: 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語句INexists的區別應用

應用場景 將不 集中 pre 代碼 根據 gif 效率 .cn   表展示     首先,查詢中涉及到的兩個表,一個user和一個order表,具體表的內容如下:     user表:          order表:        in     確定給定的值是否與子查

HibernategetCurrentSession()與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語句INexists的區別應用 [筆記] SQL效能優化 - 避免使用 IN NOT IN

曾經一次去面試,被問及in與exists的區別,記得當時是這麼回答的:''in後面接子查詢或者(xx,xx,xx,,,),exists後面需要一個true或者false的結果",當然這麼說也不算錯,但別人想聽的是sql優化相關,肯定是效率的問題,只是那個時候確實不知道它們在sql優化上的區別,只知道用in會進