Java面試-框架篇Mybatis,助你2020

相信技術改變自己和家人的生活

Java面試-框架篇Mybatis

一、mybatis簡介

(1)Mybatis 是一個半 ORM(對象關係映射)框架,它內部封裝了 JDBC,開發時只需要關注 SQL 語句本身,不需要花費精力去處理加載驅動、創建連接、創建statement 等繁雜的過程。程序員直接編寫原生態 sql,可以嚴格控制 sql 執行性能,靈活度高。


(2)MyBatis 可以使用 XML 或註解來配置和映射原生信息,將 POJO 映射成數據庫中的記錄,避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。

(3)通過 xml 文件或註解的方式將要執行的各種 statement 配置起來,並通過java 對象和 statement 中 sql 的動態參數進行映射生成最終執行的 sql 語句,最後由 mybatis 框架執行 sql 並將結果映射為 java 對象並返回。(從執行 sql 到返回 result 的過程)。

二、mybatis 優缺點對比

優點:

1、基於sql語句編程,相當靈活。

2、消除了JDBC的大量冗餘代碼,不需要手動開關連接。

3、兼容各種數據庫。

4、能夠很好的與Spring結合

5、提供映射標籤,支持對象與數據庫的ORM字段關係映射。

缺點:

1、SQL語句編寫工作量比較大

2、Sql語句依賴數據庫,導致移植性比較差。

二、Mybatis與hibernate有哪些不同

1、Mybatis需要編寫SQL語句。

2、Mybatis可以直接寫原生sql,可以控制sql執行性能,靈活度高。

3、Hibernate對象\\關係映射能力強,數據無關性好。

三、#{} 與 ${} 區別

#{}是預編譯處理,${}是字符串替換。

Mybatis 在處理#{}時,會將 sql 中的#{}替換為?號,調用 PreparedStatement 的set 方法來賦值;

Mybatis 在處理${}時,就是把${}替換成變量的值。

使用#{}可以有效的防止 SQL 注入,提高系統安全性。

四、Mybatis執行原理

Java面試-框架篇Mybatis,助你2020

1)讀取 MyBatis 配置文件:mybatis-config.xml 為 MyBatis 的全局配置文件,配置了 MyBatis 的運行環境等信息,例如數據庫連接信息。

2)加載映射文件。映射文件即 SQL 映射文件,該文件中配置了操作數據庫的 SQL 語句,需要在 MyBatis 配置文件 mybatis-config.xml 中加載。mybatis-config.xml 文件可以加載多個映射文件,每個文件對應數據庫中的一張表。

3)構造會話工廠:通過 MyBatis 的環境等配置信息構建會話工廠 SqlSessionFactory。

4)創建會話對象:由會話工廠創建 SqlSession 對象,該對象中包含了執行 SQL 語句的所有方法。

5)Executor 執行器:MyBatis 底層定義了一個 Executor 接口來操作數據庫,它將根據 SqlSession 傳遞的參數動態地生成需要執行的 SQL 語句,同時負責查詢緩存的維護。

6)MappedStatement 對象:在 Executor 接口的執行方法中有一個 MappedStatement 類型的參數,該參數是對映射信息的封裝,用於存儲要映射的 SQL 語句的 id、參數等信息。

7)輸入參數映射:輸入參數類型可以是 Map、List 等集合類型,也可以是基本數據類型和 POJO 類型。輸入參數映射過程類似於 JDBC 對 preparedStatement 對象設置參數的過程。

8)輸出結果映射:輸出結果類型可以是 Map、 List 等集合類型,也可以是基本數據類型和 POJO 類型。輸出結果映射過程類似於 JDBC 對結果集的解析過程。


Java面試-框架篇Mybatis,助你2020

五、JDBC執行流程

1、導入SQL相關的包

3、註冊mysql驅動

4、創建一個查詢

5、從resultSet中獲取數據

6、關閉連接

六、模糊查詢like語句怎麼寫

1、在java代碼中添加sql通配符

2、在sql語句中拼接

七、Dao 接口的工作原理是什麼?

Dao 接口即 Mapper 接口。接口的全限名,就是映射文件中的 namespace 的值;接口的方法名,就是映射文件中 Mapper 的 Statement 的 id 值;接口方法內的參數,就是傳遞給 sql 的參數。

Mapper 接口是沒有實現類的,當調用接口方法時,接口全限名+方法名拼接字符串作為 key 值,可唯一定位一個 MapperStatement。在 Mybatis 中,每一個<select>、<insert>、<update>、<delete>標籤,都會被解析為一個MapperStatement 對象。/<delete>/<update>/<insert>/<select>

舉例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到 namespace 為 com.mybatis3.mappers.StudentDao 下面 id 為findStudentById 的 MapperStatement。

Mapper 接口裡的方法,是不能重載的,因為是使用 全限名+方法名 的保存和尋找策略。Mapper 接口的工作原理是 JDK 動態代理,Mybatis 運行時會使用 JDK動態代理為 Mapper 接口生成代理對象 proxy,代理對象會攔截接口方法,轉而執行 MapperStatement 所代表的 sql,然後將 sql 執行結果返回。


七、Mybatis如何做分頁的

Mybatis 使用 RowBounds 對象進行分頁,它是針對 ResultSet 結果集執行的內存分頁,而非物理分頁。可以在 sql 內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。

分頁插件的基本原理是使用 Mybatis 提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的 sql,然後重寫 sql,根 據 dialect 方言,添加對應的物理分頁語句和物理分頁參數。

在StatementHandler之前進行攔截,對MappedStatement進行一系列的操作(大致就是拼上分頁sql)

Java面試-框架篇Mybatis,助你2020


八、mybatis如何批量插入

1、使用foreach標籤

Java面試-框架篇Mybatis,助你2020


2、Java代碼編寫

Java面試-框架篇Mybatis,助你2020


九、如何獲取插入數據的主鍵

1、insert 方法總是返回一個 int 值 ,這個值代表的是插入的行數。

2、如果採用自增長策略,自動生成的鍵值在 insert 方法執行完後可以被設置到傳入的參數對象中。

Java面試-框架篇Mybatis,助你2020

十、Mapper中如何傳遞參數,有哪幾種方式?

第一種:DAO 層的函數

public UserselectUser(String name,String area);

對應的 xml,#{0}代表接收的是 dao 層中的第一個參數,#{1}代表 dao 層中第二參數,更多參數一致往後加即可。

第二種: 使用 @param 註解:

第三種:多個參數封裝成 map

十一、簡述mybatis動態SQL

1、Mybatis 動態 SQL ,可以讓我們在 XML 映射文件內,以 XML 標籤的形 式編寫動態 SQL ,完成邏輯判斷和動態拼接 SQL 的功能。

2、Mybatis 提供了 9 種動態 SQL 標籤:、<choose>、<when>、<otherwise>、<trim>、<when>、、<foreach>、<bind>。

3、其執行原理為,使用 OGNL 的表達式,從 SQL 參數對象中計算表達式的值,根據表達式的值動態拼接 SQL ,以此來完成動態 SQL 的功能。

十二、Mybatis的延遲加載

Mybatis 僅支持 association 關聯對象和 collection 關聯集合對象的延遲加載,association 指的就是一對一,collection 指的就是一對多查詢。在 Mybatis配置文件中,可以配置是否啟用延遲加載 lazyLoadingEnabled=true|false。

它的原理是,使用 CGLIB 創建目標對象的代理對象,當調用目標方法時,進入攔截器方法,比如調用 a.getB().getName(),攔截器 invoke()方法發現 a.getB()是null 值,那麼就會單獨發送事先保存好的查詢關聯 B 對象的 sql,把 B 查詢上來,然後調用 a.setB(b),於是 a 的對象 b 屬性就有值了,接著完成 a.getB().getName()方法的調用。這就是延遲加載的基本原理。

當然了,不光是 Mybatis,幾乎所有的包括 Hibernate,支持延遲加載的原理都是一樣的。

十三、Mybatis 一二級緩存

1)一級緩存: 基於 PerpetualCache 的 HashMap 本地緩存,其存儲作用域為Session,當 Session flush 或 close 之後,該 Session 中的所有 Cache 就將清空,默認打開一級緩存。

2)二級緩存與一級緩存其機制相同,默認也是採用 PerpetualCache,HashMap存儲,不同在於其存儲作用域為 Mapper(Namespace),並且可自定義存儲源,如 Ehcache。默認不打開二級緩存,要開啟二級緩存,使用二級緩存屬性類需要實現 Serializable 序列化接口(可用來保存對象的狀態),可在它的映射文件中配置<cache> ;

3)對於緩存數據更新機制,當某一個作用域(一級緩存 Session/二級緩存Namespaces)的進行了 C/U/D 操作後,默認該作用域下所有 select 中的緩存將被 clear。

十四、 簡述 Mybatis 的插件運行原理,以及如何編寫一個插件

Mybatis 僅可以編寫針對 ParameterHandler、ResultSetHandler、StatementHandler、Executor 這 4 種接口的插件,Mybatis 使用 JDK 的動態代理,為需要攔截的接口生成代理對象以實現接口方法攔截功能,每當執行這 4 種接口對象的方法時,就會進入攔截方法,具體就是 InvocationHandler 的 invoke()方法,當然,只會攔截那些你指定需要攔截的方法。

編寫插件:實現 Mybatis 的 Interceptor 接口並複寫 intercept()方法,然後在給插件編寫註解,指定要攔截哪一個接口的哪些方法即可,記住,別忘了在配置文件中配置你編寫的插件。


分享到:


相關文章: