你們好,我是Java最全面試題庫
的提褲姐,今天這篇是JavaEE面試題系列的第五篇,主要總結了Mybatis
相關的問題,在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java
一、Mybatis是一個半ORM(對象關係映射)框架,它內部封裝了JDBC,開發時只須要關注SQL語句自己,不須要花費精力去處理加載驅動、建立鏈接、建立statement等繁雜的過程。程序員直接編寫原生態sql,能夠嚴格控制sql執行性能,靈活度高 二、MyBatis 可使用 XML 或註解來配置和映射原生信息,將 POJO映射成數據庫中的記錄,避免了幾乎全部的 JDBC 代碼和手動設置參數以及獲取結果集 三、經過xml 文件或註解的方式將要執行的各類 statement 配置起來,並經過java對象和 statement中sql的動態參數進行映射生成最終執行的sql語句,最後由mybatis框架執行sql並將結果映射爲java對象並返回程序員
1.Mybatis和hibernate不一樣,它不徹底是一個ORM框架,由於MyBatis須要程序員編寫Sql語句 2.Mybatis直接編寫原生態sql,能夠嚴格控制sql執行性能,靈活度高,很是適合對關係數據模型要求不高的軟件開發,由於這類軟件需求變化頻繁,一但需求變化要求迅速輸出成果。可是靈活的前提是mybatis沒法作到數據庫無關性,若是須要實現支持多種數據庫的軟件,則須要自定義多套sql映射文件,工做量大 3.Hibernate對象/關係映射能力強,數據庫無關性好,對於關係模型要求高的軟件,若是用hibernate開發能夠節省不少代碼,提升效率。面試
解決:在 SqlMapConfig.xml 中配置數據連接池,使用鏈接池管理數據庫連接。sql
解決:將 Sql 語句配置在 XXXXmapper.xml 文件中與 java 代碼分離。數據庫
解決: Mybatis 自動將 java 對象映射至 sql 語句。編程
解決: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>
複製代碼
Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法內的參數,就是傳遞給sql的參數。
Mapper接口是沒有實現類的,當調用接口方法時,接口全限名+方法名
拼接字符串做爲key值,可惟必定位一個MapperStatement。在Mybatis中,每個select、insert、update、delete標籤,都會被解析爲一個MapperStatement
對象。
Mybatis使用RowBounds
對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁。能夠在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可使用分頁插件來完成物理分頁。
分頁插件的基本原理是使用Mybatis提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,而後重寫sql,根據dialect方言,添加對應的物理分頁語句和物理分頁參數。
<insert id="xxx" usegeneratedkeys="true" keyproperty="id">
insert into xxxx (xxx) values (#{xxxx})
</insert>
複製代碼
一、對應的xml,#{0}
表明接收的是dao層中的第一個參數,#{1}表明dao層中第二參數 二、使用使用 @param
註解 三、使用map
封裝參數
Mybatis提供了9種動態sql標籤:
<trim/>
標籤<if/>
標籤:對於該標籤的執行,當test的值爲true時,會將其包含的sql片斷拼接到其後所在的sql語句中。<where/>
標籤<set/>
標籤<foreach/>
標籤:實現對於數組於集合的遍歷。<choose/>
標籤:該標籤只能夠包含,能夠包含多個與一個。他們聯合使用,完成java中的開關語句switch..case功能。<when/>
標籤<otherwise/>
標籤<bind/>
標籤一、Mapper接口方法名和mapper.xml中定義的每一個sql的id
相同 二、Mapper接口方法的輸入參數類型和mapper.xml中定義的每一個sql的parameterType的類型
相同 三、Mapper接口方法的輸出參數類型和mapper.xml中定義的每一個sql的resultType的類型
相同 四、Mapper.xml文件中的namespace便是mapper接口
的類路徑。
1.一級緩存: 基於PerpetualCache的HashMap本地緩存
,其存儲做用域爲Session,當Session flush或close以後,該Session中的全部Cache就將清空,默認打開一級緩存。 2.二級緩存與一級緩存其機制相同,默認也是採用PerpetualCache,HashMap 存儲,不一樣在於其存儲做用域爲 Mapper(Namespace),而且可自定義存儲源,如 Ehcache。默認不打開二級緩存,要開啓二級緩存,使用二級緩存屬性類須要實現Serializable序列化接口(可用來保存對象的狀態),可在它的映射文件中配置 3.對於緩存數據更新機制,當某一個做用域(一級緩存 Session/二級緩存Namespaces)的進行了cud操做後,默認該做用域下全部select中的緩存將被clear掉並從新更新,若是開啓了二級緩存,則只根據配置判斷是否刷新。