1. 程式人生 > >Java開發工程師最新面試題庫系列——Mybatis框架部分(附答案)

Java開發工程師最新面試題庫系列——Mybatis框架部分(附答案)

##### 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