Java開發工程師最新面試題庫系列——Mybatis框架部分(附答案)
阿新 • • 發佈:2021-03-06
##### Mybatis
1. Mybatis是什麼框架?
答:持久層框架
2. Mybatis和ORM有什麼區別?
答:ORM是物件關係對映的一種設計理念,也就是物件屬性對應資料庫欄位,讓開發人員以操作物件的方式操作資料庫資料。Mybatis是基於ORM框架實現的持久層框架,但它並是不完全ORM,Mybatis只是將物件與sql語句關聯起來了,而不是與資料庫資料關聯;
3. Mybatis為什麼是半自動ORM對映?
答:Mybatis只是將物件與sql語句關聯起來了,而不是與資料庫資料關聯。因此需要手動編寫SQL語句,所以是半自動ORM對映。
4. Mybatis框架的應用場景?
答:對SQL語句的查詢效能要求比較高的地方,例如需要在查詢時帶上某個索引欄位條件,以此來優化查詢效能。
5. Mybatis有哪些優缺點?
答:
###### 1.sql語句與程式碼分離,存放於xml配置檔案中:
優點:便於維護管理,不用在java程式碼中找這些語句;
缺點: JDBC方式可以用用打斷點的方式除錯,但是Mybatis不能,需要通過log4j日誌輸出日誌資訊幫助除錯,然後在配置檔案中修改。
###### 2.用邏輯標籤控制動態SQL的拼接:
優點:用標籤代替編寫邏輯程式碼;
缺點:拼接複雜SQL語句時,沒有程式碼靈活,拼寫比較複雜。不要使用變通的手段來應對這種複雜的語句。
###### 3.查詢的結果集與java物件自動對映:
優點:保證名稱相同,配置好對映關係即可自動對映或者,不配置對映關係,通過配置列名=欄位名也可完成自動對映。
缺點:對開發人員所寫的SQL依賴很強。
###### 4.編寫原聲SQL:
優點:接近JDBC,比較靈活。
缺點:對SQL語句依賴程度很高;並且屬於半自動,資料庫移植比較麻煩,比如mysql資料庫程式設計Oracle資料庫,部分的sql語句需要調整。
6. Mybatis和Hibernate有什麼區別?
答:
1、Mybatis是半ORM,Hibernate是全ORM
2、Mybatis是對JDBC細粒度的封裝,SQL語句還是需要開發人員編寫。Hibernate是對JDBC粗粒度的封裝,完全不需要開發人員編寫SQL。
3、Mybatis更加靈活,在SQL語句編寫時更好對資料庫效能進行優化。Hibernate分裝得比較狠,優化SQL困難。
4、Mybatis移植性相對較差,因為不同的資料庫SQL語句是有差異的,Hibernate移植好,不同的資料庫採用不同的方言配置即可
5、Mybatis開發週期長,體現在編寫SQL語句和結果集對映,Hibernate開發週期短,能夠快速開發。
7. Mybatis有哪幾種SQL編寫形式?
答:
1、xml靜態SQL編寫
2、xml動態SQL編寫
3、註解@Select標記在方法上 編寫SQL
8. Mybatis支援哪些傳參的方法?
答:
###### 方法1:順序傳參法
```java
public User selectUser(String name, int deptId);
```
###### 方法2:@Param註解傳參法
```csharp
public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);
```
###### 方法3:Map傳參法
```csharp
public User selectUser(Map params);
```
###### 方法4:Java Bean傳參法
```csharp
public User selectUser(Map params);
```
9. Mybatis的$和#傳參的區別?
答:${}是將引數與sql語句進行字串拼接,不可避免的會程式碼SQL注入問題。安全性差,但可以通過一些手段來規避例如:正則表示式過濾不安全字元。#{}是將引數替換成?,之後與PerpardStatement進行SQL預編譯的方式進行引數設定.
10. Mybatis可以對映到列舉類嗎?
答:可以,需要自定義對列舉類的型別轉換器。例如寫一個類為EnumTypeHandler繼承BaseTypeHandler<列舉型別>,重寫其中的方法,在getNullableResult方法中更具返回結果做響應的轉換操作。
11. Mybatis怎麼封裝動態SQL?
答:
12. Mybatis的trim標籤有什麼作用?
答: trim標記是一個格式化的標記,可以完成set或者是where標記的功能,它的引數有prefix字首,prefixOverrides匹配前置去除,suffix字尾,suffixOverrides匹配字尾去除
13. Mybatis怎麼實現分頁?
答:
1、使用SQL的LIMIT做分頁,分頁引數可以使用Mybatis提供的Page封裝,傳給Mapper。然後使用LIMIT (page-1)*size,size方式查詢資料
2、使用PageHelper外掛實現
3、使用Mybatis的Interceptor攔截器實現
14. Mybatis的流式查詢有什麼作用?
答:
**流式查詢**指的是查詢成功後不是返回一個集合而是返回一個迭代器,應用每次從迭代器取一條查詢結果。流式查詢的好處是能夠降低記憶體使用。
如果沒有流式查詢,我們想要從資料庫取 1000 萬條記錄而又沒有足夠的記憶體時,就不得不分頁查詢,而分頁查詢效率取決於表設計,如果設計的不好,就無法執行高效的分頁查詢。因此流式查詢是一個數據庫訪問框架必須具備的功能。
流式查詢的過程當中,資料庫連線是保持開啟狀態的,因此要注意的是:執行一個流式查詢後,資料庫訪問框架就不負責關閉資料庫連線了,需要應用在取完資料後自己關閉。
15. Mybatis模糊查詢LIKE語句應該怎麼寫?
答:
1、${%field%}:存在SQL注入問題,不推薦
2、"%"#{field}"%"
3、CONCAT('%',#{field},'%')
4、bind標籤瞭解
16. Mybatis配置檔案中的SQL id是否能重複?
答:同一個namespace下是不能重複的
17. Mybatis如何防止SQL注入?
答:
1、使用#{}來設定引數
2、正則表示式過濾非法字元
18. Mybatis如何實現主鍵回填?
答:使用useGeneratedKeys="true",標識開啟主鍵回填,keyProperty="id"指定主鍵回填設定到哪一個屬性。
```xml
insert into t_book (b_name,author) values (#{name},#{author});
```
19. Mybatis使用了哪些設計模式?
答:
1. Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
2. 工廠模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
3. 單例模式,例如ErrorContext和LogFactory;
4. 代理模式,Mybatis實現的核心,比如MapperProxy、ConnectionLogger,用的jdk的動態代理;還有executor.loader包使用了cglib或者javassist達到延遲載入的效果;
5. 組合模式,例如SqlNode和各個子類ChooseSqlNode等;
6. 模板方法模式,例如BaseExecutor和SimpleExecutor,還有BaseTypeHandler和所有的子類例如IntegerTypeHandler;
7. 介面卡模式,例如Log的Mybatis介面和它對jdbc、log4j等各種日誌框架的適配實現;
20. Mybatis的快取機制有什麼作用?
答:做伺服器的程序內部快取,提高查詢效率,降低資料庫訪問頻率。Mybatis有三種快取,一級快取、二級快取、第三方快取EhCache,一級快取時預設開啟的,作用域時SqlSession。二級快取預設關閉需要在配置中使用enableCache="true"開啟,二級快取時namespace作用域的。第三方快取需要引入額外Jar包,並且在配置中開啟二級快取開關,配置第三方快取的核心類。
21. Mybatis一級快取和二級快取有什麼區別?
答:
![img](https://img-blog.csdnimg.cn/20181119143826172.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppbmhhaWppbmc=,size_16,color_FFFFFF,t_70)
1、作用域不同:
一級快取的作用域是SqlSession級別的Map,二級快取是namespace級別的,也叫全域性快取
2、預設配置不同
一級快取預設開啟,二級快取預設關閉,需要在mybatis.cfg.xml配置檔案中開啟
```xml