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:順序傳參法
    public User selectUser(String name, int deptId);
    
    <select id="selectUser" resultMap="UserResultMap">
        select * from user
        where user_name = #{0} and dept_id = #{1}
    </select>
    
    方法2:@Param註解傳參法
    public User selectUser(@Param("userName") String name, int @Param("deptId") deptId);
    
    <select id="selectUser" resultMap="UserResultMap">
        select * from user
        where user_name = #{userName} and dept_id = #{deptId}
    </select>
    
    方法3:Map傳參法
    public User selectUser(Map<String, Object> params);
    
    <select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">
        select * from user
        where user_name = #{userName} and dept_id = #{deptId}
    </select>
    
    方法4:Java Bean傳參法
    public User selectUser(Map<String, Object> params);
    
    <select id="selectUser" parameterType="com.test.User" resultMap="UserResultMap">
        select * from user
        where user_name = #{userName} and dept_id = #{deptId}
    </select>
    
  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"指定主鍵回填設定到哪一個屬性。

    <insert id="insertBook" useGeneratedKeys="true" keyProperty="id">
        insert into t_book (b_name,author) values (#{name},#{author});
    </insert>
    
  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

    1、作用域不同:

    ​ 一級快取的作用域是SqlSession級別的Map,二級快取是namespace級別的,也叫全域性快取

    2、預設配置不同

    ​ 一級快取預設開啟,二級快取預設關閉,需要在mybatis.cfg.xml配置檔案中開啟

    <settings>
       <setting name="cacheEnabled" value="true"/>
    </settings
    
  22. Mybatis-plus和TK-Mybatis是什麼框架?

    答:Mybatis的增強框架,幫助開發人員更加簡化開發。這些框架提供了大部分的簡單SQL語句封裝的API,提供了分頁外掛,簡化了配置流程。不過只對單表有好的支援,多表關聯查詢支援差,一般需要手動編寫多表的SQL,不過可以原生和增強一起使用。

相關文章