接下來,我們一起來看乙個案例:根據使用者的姓名來篩選使用者資訊,其中使用者姓名不確定,是動態變化的,sql如下:
select
*from userinfo where user_name=「張三」; //查詢名稱是張三的資訊
在xml中
select
*from userinfo where user_name=
# //根據名稱動態查詢使用者資訊,#將引數解析成字串
或者:
select
*from userinfo where user_name=『$' //$會將引數解析成物件 需要加上引號引住
一、主要區別如下:
1、#
將傳入的引數都當成乙個字串
,會對自動傳入的資料加乙個雙引號
。如:order by #
,如果傳入的值是18,那麼解析成sql時的值為order by "18"
, 如果傳入 age,則會解析為order by "age"
2、$
將傳入的引數直接顯示生成在sql中
,被當成乙個物件。如:order by$
,如果傳入的值是18,那麼解析成sql時的值為order by 18
, 如果傳入的值是age,則解析成的sql為order by age
3、# 方式底層採用預編譯
方式preparedstatement
,能夠很大程度防止sql注入
;$方式底層只是statement
,無法防止sql注入
。
4、$ 方式一般用於傳入資料庫物件
,例如傳入表名。
5、一般能用#的就別用$
注意點:mybatis排序時使用order by 動態引數時需要注意,用$而不是#
二、sql預編譯
1、定義:
指資料庫驅動在傳送 sql 語句和引數
給 dbms 之前對 sql 語句進行編譯
,這樣 dbms 執行 sql 時,就不需要重新編譯。
2、為什麼需要預編譯
jdbc 中使用物件 preparedstatement 來抽象預編譯語句
,使用預編譯。預編譯階段可以優化 sql 的執行
。預編譯之後的 sql 多數情況下可以直接執行
,dbms 不需要再次編譯,越複雜的sql,編譯的複雜度將越大,預編譯階段可以合併多次操作為乙個操作。預編譯語句物件可以重複利用
。把乙個 sql 預編譯後產生的 preparedstatement 物件快取
下來,下次對於同乙個sql,可以直接使用這個快取的 preparedstate 物件。mybatis預設
情況下,將對所有的 sql 進行預編譯
。
三、預編譯處理差異
#{} 和 ${} 在預編譯中的處理是不一樣的。
以上,#{} 的引數替換是發生在 dbms 中,而 ${} 則發生在動態解析過程中。
參考:sql 中 ${} 和 #{}的區別
#{}與${}的區別
Mybatis以及簡單實現
mybatis是乙個開源的資料持久層框架。它內部封裝了通過jdbc訪問資料庫的操作,支援普通的sql查詢 儲存過程和高階對映,幾乎消除了所有的jdbc 和引數的手工設定以及結果集的檢索。mybatis作為持久層框架,其主要思想是將程式中的大量sql語句剝離出來,配置在配置檔案中,實現sql的靈活配置...
MyBatis原理分析
參考部落格 深入理解mybatis原理 一 jdbc的工作流程 載入資料庫的驅動程式 建立資料連線物件 建立statement物件 執行sql語句 處理返回結果集 關閉資料庫連線 二 mybatis和資料庫互動的方式 1 使用傳統的mybatis提供的api 此方式建立乙個sqlsession物件,...
MyBatis原理分析
參考部落格 深入理解mybatis原理 一 jdbc的工作流程 載入資料庫的驅動程式 建立資料連線物件 建立statement物件 執行sql語句 處理返回結果集 關閉資料庫連線 二 mybatis和資料庫互動的方式 1 使用傳統的mybatis提供的api 此方式建立乙個sqlsession物件,...