1,什么是Mybatis?Mybatis的優缺點?
MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或注解用於配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成數據庫中的記錄。
JDBC有四個核心對象:
(1)DriverManager,用於注冊數據庫連接
(2)Connection,與數據庫連接對象
(3)Statement/PrepareStatement,操作數據庫SQL語句的對象
(4)ResultSet,結果集或一張虛擬表
Mybatis也有四個核心對象:
(1)SqlSession對象,該對象中包含了執行SQL語句的所有方法【1】。類似於JDBC里面的Connection 【2】。
(2)Executor接口,它將根據SqlSession傳遞的參數動態地生成需要執行的SQL語句,同時負責查詢緩存的維護。類似於JDBC里面的Statement/PrepareStatement。
(3)MappedStatement對象,該對象是對映射SQL的封裝,用於存儲要映射的SQL語句的id、參數等信息。
(4)ResultHandler對象,用於對返回的結果進行處理,最終得到自己想要的數據格式或類型。可以自定義返回類型。
優點:
(1)它內部封裝了JDBC,開發時只需要關注SQL語句本身,不需要花費精力去處理加載驅動、創建連接、創建statement等繁雜的過程。
(2)很好的與各種數據庫兼容(因為MyBatis使用JDBC來連接數據庫,所以只要JDBC支持的數據庫MyBatis都支持)。
(3)基於SQL語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL寫在XML里,解除sql與程序代碼的耦合,便於統一管理;提供XML標簽,支持編寫動態SQL語句,並可重用。
(4)能與Spring很好的集成
缺點:
(1)SQL語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL語句的功底有一定要求。
(2)SQL語句依賴於數據庫,導致數據庫移植性差,不能隨意更換數據庫。
2,Mybatis的工作流程

(1)讀取配置文件,配置文件包含數據庫連接信息和Mapper映射文件或者Mapper包路徑。
(2)有了這些信息就能通過SqlSessionFactoryBuilder類的build()方法來創建SqlSessionFactory。SqlSessionFactory的生命周期是程序級,程序運行的時候建立起來,程序結束的時候消亡
(3)再通過調用SqlSessionFactory的openSession()方法產生SqlSession,該對象中包含了執行SQL語句增刪改查的所有方法。SqlSession是過程級,一個方法中建立,方法結束應該關閉
(4)創建Executor(執行器)接口,它將根據SqlSession傳遞的參數動態地生成需要執行的SQL語句,同時負責查詢緩存的維護
(5)在Executor接口的執行方法中有一個MappedStatement類型的參數,該參數是對映射信息的封裝,用於存儲要映射的SQL語句的id、參數等信息
(6)在有了sql語句的映射信息后就會到指定數據庫中執行sql語句8
3,#{}和${}的區別是什么?
#{}是預編譯處理,${}是字符串替換
Mybatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值;
Mybatis在處理${}時,就是把${}替換成變量的值。
使用#{}可以有效的防止SQL注入,提高系統安全性。
4,如何解決實體類中的屬性名和表中的字段名不一樣?
最常用的是ResultMap:

5,接口的動態代理需要滿足哪些要求?
(1)namespace必須是接口的全路徑名

(2)接口的方法名必須和接口的id一致


(3)接口的入參與parameterType類型一致,返回值與resultType類型一致

6,Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重復?
不同的Xml映射文件,如果配置了namespace,那么id可以重復;如果沒有配置namespace,那么id不能重復;原因就是namespace+id是作為Map<String, MapperStatement>的key使用的,如果沒有namespace,就剩下id,那么,id重復會導致數據互相覆蓋。有了namespace,自然id就可以重復,namespace不同,namespace+id自然也就不同。但是,在以前的Mybatis版本的namespace是可選的,不過新版本的namespace已經是必須的了。
7,一對一關聯查詢和一對多關聯查詢的實現
一對一關聯查詢:訂單表(Order)是主表,學生表(student)是關聯表
定義resultMap,使用associate標簽關聯一對一關系表

一對多關聯查詢:學生表(Student)為主表,訂單表(Order)為關聯表
定義resultMap,使用collection標簽關聯一對一關系表

