持續輸出面試題之MyBatis篇

開篇介紹

你們好,我是Java最全面試題庫的提褲姐,今天這篇是JavaEE面試題系列的第五篇,主要總結了Mybatis相關的問題,在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java

什麼是Mybatis?

一、Mybatis是一個半ORM(對象關係映射)框架,它內部封裝了JDBC,開發時只須要關注SQL語句自己,不須要花費精力去處理加載驅動、建立鏈接、建立statement等繁雜的過程。程序員直接編寫原生態sql,能夠嚴格控制sql執行性能,靈活度高 二、MyBatis 可使用 XML 或註解來配置和映射原生信息,將 POJO映射成數據庫中的記錄,避免了幾乎全部的 JDBC 代碼和手動設置參數以及獲取結果集 三、經過xml 文件或註解的方式將要執行的各類 statement 配置起來,並經過java對象和 statement中sql的動態參數進行映射生成最終執行的sql語句,最後由mybatis框架執行sql並將結果映射爲java對象並返回程序員

MyBatis與Hibernate有哪些不一樣

1.Mybatis和hibernate不一樣,它不徹底是一個ORM框架,由於MyBatis須要程序員編寫Sql語句 2.Mybatis直接編寫原生態sql,能夠嚴格控制sql執行性能,靈活度高,很是適合對關係數據模型要求不高的軟件開發,由於這類軟件需求變化頻繁,一但需求變化要求迅速輸出成果。可是靈活的前提是mybatis沒法作到數據庫無關性,若是須要實現支持多種數據庫的軟件,則須要自定義多套sql映射文件,工做量大 3.Hibernate對象/關係映射能力強,數據庫無關性好,對於關係模型要求高的軟件,若是用hibernate開發能夠節省不少代碼,提升效率。面試

JDBC 編程有哪些不足之處,MyBatis 是如何解決這些問題的?

  • 數據庫連接建立、釋放頻繁形成系統資源浪費從而影響系統性能,若是使用數據庫連接池可解決此問題。

解決:在 SqlMapConfig.xml 中配置數據連接池,使用鏈接池管理數據庫連接。sql

  • Sql 語句寫在代碼中形成代碼不易維護,實際應用 sql 變化的可能較大,sql 變更須要改變 java 代碼。

解決:將 Sql 語句配置在 XXXXmapper.xml 文件中與 java 代碼分離。數據庫

  • 向 sql 語句傳參數麻煩,由於 sql 語句的 where 條件不必定,可能多也可能少,佔位符須要和參數一一對應。

解決: Mybatis 自動將 java 對象映射至 sql 語句。編程

  • 對結果集解析麻煩,sql 變化致使解析代碼變化,且解析前須要遍歷,如何能將數據庫記錄封裝成 pojo 對象

解決:Mybatis 自動將 sql 執行結果映射至 java 對象。數組

#{}和${}的區別是什麼

#{}是預編譯處理,${}是字符串替換 Mybatis在處理#{}時,會將sql中的#{}替換爲?號,調用PreparedStatement的set方法來賦值; Mybatis在處理${}時,就是把{}替換成變量的值。緩存

使用#{}能夠有效的防止SQL注入,提升系統安全性安全

當實體類中的屬性名和表中的字段名不同如何解決?

使用resultMapmarkdown

<resultMap type="xxx.xx.xxx.xx" id="xxx">
        <!-- 用id屬性來映射主鍵字段 -->
        <id property=」id」 column=」main_id」>
</reslutMap>
複製代碼

一般一個Xml映射文件,都會寫一個Dao接口與之對應,這個Dao接口的工做原理是什麼?

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

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

Mybatis是如何進行分頁的?分頁插件的原理是什麼?

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

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

如何獲取自動生成的id?

<insert id="xxx" usegeneratedkeys="true" keyproperty="id">
     insert into xxxx (xxx) values (#{xxxx})
</insert>
複製代碼

在mapper中如何傳遞多個參數?

一、對應的xml,#{0}表明接收的是dao層中的第一個參數,#{1}表明dao層中第二參數 二、使用使用 @param 註解 三、使用map封裝參數

mybatis有哪些動態標籤?

Mybatis提供了9種動態sql標籤:

  • <trim/>標籤
  • <if/>標籤:對於該標籤的執行,當test的值爲true時,會將其包含的sql片斷拼接到其後所在的sql語句中。
  • <where/>標籤
  • <set/>標籤
  • <foreach/>標籤:實現對於數組於集合的遍歷。
  • <choose/>標籤:該標籤只能夠包含,能夠包含多個與一個。他們聯合使用,完成java中的開關語句switch..case功能。
  • <when/>標籤
  • <otherwise/>標籤
  • <bind/>標籤

MyBatis的mapper接口調用時有那些限定?

一、Mapper接口方法名和mapper.xml中定義的每一個sql的id相同 二、Mapper接口方法的輸入參數類型和mapper.xml中定義的每一個sql的parameterType的類型相同 三、Mapper接口方法的輸出參數類型和mapper.xml中定義的每一個sql的resultType的類型相同 四、Mapper.xml文件中的namespace便是mapper接口的類路徑。

說一下mybatis緩存?

1.一級緩存: 基於PerpetualCache的HashMap本地緩存,其存儲做用域爲Session,當Session flush或close以後,該Session中的全部Cache就將清空,默認打開一級緩存。 2.二級緩存與一級緩存其機制相同,默認也是採用PerpetualCache,HashMap 存儲,不一樣在於其存儲做用域爲 Mapper(Namespace),而且可自定義存儲源,如 Ehcache。默認不打開二級緩存,要開啓二級緩存,使用二級緩存屬性類須要實現Serializable序列化接口(可用來保存對象的狀態),可在它的映射文件中配置 3.對於緩存數據更新機制,當某一個做用域(一級緩存 Session/二級緩存Namespaces)的進行了cud操做後,默認該做用域下全部select中的緩存將被clear掉並從新更新,若是開啓了二級緩存,則只根據配置判斷是否刷新。

相關文章
相關標籤/搜索