Mybatis中的${}和#{}區別
- 前言
- 一、${}與#{}的區別
- 1、符號型別
- 2、防注入問題
- 3、引數替換位置
- 4、引數決議
- 5、用$的情況
- 6、sql執行程序
- 7、一般能用#的就別用$
- 二、SQL決議
- 1、流程
- 2、案例
前言
動態 sql 是 mybatis 的主要特性之一,在 mapper 中定義的引數傳到 xml 中之后,在查詢之前, mybatis 會對其進行動態決議,mybatis 為我們提供了兩種支持動態 sql 的語法:#{}以及${}
提示:以下是本篇文章正文內容,下面案例可供參考
一、${}與#{}的區別
1、符號型別
(1)#{}:引數占位符,即預編譯
(2)${} :字串替換符,即SQL拼接
2、防注入問題
(1)#{}:很大程度上能防止sql 注入
(2)${}:不能防止sql 注入
3、引數替換位置
DBMS:資料庫管理系統(Database Management System)是一種操縱和管理資料庫的大型軟體,是用于建立、使用和維護資料庫,簡稱DBMS,它對資料庫進行統一的管理和控制,以保證資料庫的安全性和完整性,用戶通過DBMS訪問資料庫中的資料,資料庫管理員也通過DBMS進行資料庫的維護作業,它提供多種功能,可使多個應用程式和用戶用不同的方法在同時或不同時刻去建立,修改和詢問資料庫,
(1)#{}:變數替換是在DBMS 中
(2)${}:變數替換是在 DBMS 外
4、引數決議
(1)#{}:將傳入的資料都當成一個字串,會對傳入的變數自動加一個單引號,如:user_id = #{userId},如果傳入的值是111,那么決議成sql時的值為user_id = ‘111’,如果傳入的值是id,則決議成的sql為user_id = ‘id’,
(2)${}:將傳入的引數直接顯示生成在sql中,且不加任何引號,如:user_id = ${userId},如果傳入的值是111,那么決議成sql時的值為user_id = 111 , 如果傳入的值是id,則決議成的sql為user_id = id,
5、用$的情況
(1)MyBatis排序時使用order by 動態引數時需要注意,用$而不是#
默認情況下,使用#{}格式的語法會導致MyBatis創建預處理陳述句屬性并以它為背景設定安全的值(比如?),這樣做很安全,很迅速也是首選做法,有時你只是想直接在SQL陳述句中插入一個不改變的字串,比如,像ORDER BY,你可以這樣來使用:
ORDER BY ${columnName},這里MyBatis不會修改或轉義字串,
(2)${}方式一般用于傳入資料庫物件,例如傳入表名
Select * from ${tableName} where user_id = #{userId}
6、sql執行程序
可參考“二”部分的案例
(1)#{}:編譯好SQL后陳述句再去取值
(2)${}:取值以后再去編譯SQL陳述句
7、一般能用#的就別用$
二、SQL決議
1、流程
(1)#{}:動態決議 -> 預編譯 -> 執行
(2)${}:動態決議 -> 編譯 -> 執行
2、案例
根據用戶名name查詢用戶表user資料,如果 name 的值為 zhangsan
(1)SQL撰寫
#{}
select * from user where name = #{name};
${}
select * from user where name = ${name};
(2)(預)編譯中的處理
#{}:在預處理時,會把引數用一個占位符" ?" 代替,變成以下SQL
select * from user where name = ?;
${}:只是簡單的字串替換,在動態決議時變成以下SQL
select * from user where name = 'zhangsan';
當然了,最后的決議結果是一樣的,都是
select * from user where name = 'zhangsan';
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/384398.html
標籤:其他
