什麼是MyBatis
(1)Mybatis是一個半ORM(物件關係對映)框架,它內部封裝了JDBC,開發時只需要關注SQL
語句本身,不需要花費精力去處理載入驅動、建立連線、建立statement等繁雜的過程。程式設計師直
接編寫原生態sql,可以嚴格控制sql執行效能,靈活度高。
(2)MyBatis 可以使用 XML 或註解來配置和對映原生資訊,將 POJO對映成資料庫中的記錄,避
免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。
(3)透過xml 檔案或註解的方式將要執行的各種 statement(statement用於向資料庫傳送sql語句,對資料庫進行增刪改查) 配置起來,並透過java物件和statement中sql的動態引數進行對映生成最終執行的sql語句,最後由mybatis框架執行sql並將結果對映為java物件並返回。(從執行sql到返回result的過程)。
MyBatis的優點和缺點
優點:
- 基於SQL語句程式設計,相當靈活,不會對應用程式或者資料庫的現有設計造成任何影響,SQL寫在XML裡,解除sql與程式程式碼的耦合,便於統一管理;提供XML標籤,支援編寫動態SQL語句,並可重用。
- 與JDBC相比,減少了50%以上的程式碼量,消除了JDBC大量冗餘的程式碼,不需要手動開關連線;
- 很好的與各種資料庫相容(因為MyBatis使用JDBC來連線資料庫,所以只要JDBC支援的資料庫MyBatis都支援)。
- 能夠與Spring很好的整合;
- 提供對映標籤,支援物件與資料庫的ORM欄位關係對映;提供物件關係對映標籤,支援物件關係元件維護。
缺點 - SQL語句的編寫工作量較大,尤其當欄位多、關聯表多時,對開發人員編寫SQL語句的功底有一定要求。
- SQL語句依賴於資料庫,導致資料庫移植性差,不能隨意更換資料庫。
{}和${}的區別
-
{}是預編譯處理,${}是字串替換。
- Mybatis在處理#{}時,會將sql中的#{}替換為?號,呼叫PreparedStatement的set方法來賦值,Mybatis在處理${}時,就是把${}替換成變數的值。
- 使用#{}可以有效的防止SQL隱碼攻擊,提高系統安全性。
● 能用 #{} 的地方就用 #{},不用或少用 ${}
● 表名作引數時,必須用 ${}。如:select * from ${tableName}
● order by 時,必須用 ${}。如:select * from t_user order by ${columnName}
● 使用 ${} 時,要注意何時加或不加單引號,即 和 ′ {} 和 '和
Mybatis是如何進行分頁的,分頁外掛的原理
Mybatis使用RowBounds物件進行分頁,它是針對ResultSet結果集執行的記憶體分頁,而非物理分頁。可以在sql內直接拼寫帶有物理分頁的引數來完成物理分頁功能,也可以使用分頁外掛來完成物理分頁,比如:MySQL資料的時候,在原有SQL後面拼寫limit。
分頁外掛的基本原理是使用Mybatis提供的外掛介面,實現自定義外掛,在外掛的攔截方法內攔截待執行的sql,然後重寫sql,根據dialect方言,新增對應的物理分頁語句和物理分頁引數。
Mybatis是如何將sql執行結果封裝為目標物件並返回的
第一種是使用標籤,逐一定義資料庫列名和物件屬性名之間的對映關係。
第二種是使用sql列的別名功能,將列的別名書寫為物件屬性名。
有了列名與屬性名的對映關係後,Mybatis透過反射建立物件,同時使用反射給物件的屬性逐一賦值並返回,那些找不到對映關係的屬性,是無法完成賦值的。
MyBatis實現一對一有幾種方式
聯合查詢和巢狀查詢
- 聯合查詢是幾個表聯合查詢,只查詢一次, 透過在resultMap裡面配置association節點配置一對一的類就可以完成;
- 巢狀查詢是先查一個表,根據這個表裡面的結果的 外來鍵id,去再另外一個表裡面查詢資料,也是透過 association配置,但另外一個表的查詢透過select屬性配置。
Mybatis設計模式 - Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder,XMLStatementBuilder、CacheBuilder;
- 工廠模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
- 單例模式,例如ErrorContext和LogFactory;
- 代理模式,Mybatis實現的核心,比如MapperProxy、ConnectionLogger,用的jdk的動態代理;還有executor.loader包使用了cglib或者javassist達到延遲載入的效果;
- 組合模式,例如SqlNode和各個子類ChooseSqlNode等;
- 模板方法模式,例如BaseExecutor和SimpleExecutor,還有BaseTypeHandler和所有的子類例如IntegerTypeHandler;
- 介面卡模式,例如Log的Mybatis介面和它對jdbc、log4j等各種日誌框架的適配實現;
- 裝飾者模式,例如Cache包中的cache.decorators子包中等各個裝飾者的實現;
- 迭代器模式,例如迭代器模式PropertyTokenizer;