Mybatis中 以及 分析

2021-09-28 18:10:59 字數 1747 閱讀 2926

接下來,我們一起來看乙個案例:根據使用者的姓名來篩選使用者資訊,其中使用者姓名不確定,是動態變化的,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物件,...