引言
面試題==知識點,這里所記錄的面試題并不針對于面試者,而是將這些面試題作為技能知識點來看待,不以刷題進大廠為目的,而是以學習為目的,這里的知識點會持續更新,目錄也會隨時進行調整,
關注公眾號:編程火箭車,在【粉絲福利】中點擊【面題大全】,其中的Java面試題在線實時更新、查看,
一、面試題導航
點這里進入JavaWeb編程面試題——導航
面試題持續更新中......
二、面試題目
1.什么是MyBatis?
(1)MyBatis 是一個半 ORM(物件關系映射)框架,它內部封裝了 JDBC,開發時只需關注 SQL 陳述句本身,不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的程序,程式員直接撰寫原生態 SQL,可以嚴格控制 SQL 執行性能,靈活度高,
(2)MyBatis 可以使用 XML 或注解來配置和映射原生資訊,將 POJO 映射成資料庫中的記錄,避免了幾乎所有的 JDBC 代碼和手動設定引數以及獲取結果集,
(3)通過 XML 檔案或注解的方式將要執行的各種 statement 配置起來,并通過 Java 物件和 statement 中 SQL 的動態引數進行映射生成最終執行的 SQL 陳述句,最后由 MyBatis 框架執行 SQL 并將結果映射為 Java 物件并回傳,(從執行 SQL 到回傳 result 的程序)
2.MyBatis優缺點?
優點:
(1)基于 SQL 陳述句編程,相當靈活,不會對應用程式或者資料庫的現有設計造成任何影響,SQL 寫在 XML 中,解除 SQL 與程式代碼的耦合,便于統一管理,提供 XML 標簽,支持撰寫動態 SQL 陳述句,并可重用;
(2)與 JDBC 相比,減少了50%以上的代碼量,消除了 JDBC 大量冗余的代碼,不需要手動開關連接;
(3)很好的與各種資料庫兼容(因為 MyBatis 使用 JDBC 來連接資料庫,所以只要 JDBC 支持的資料庫 MyBatis 都支持);
(4)能夠與 Spring 很好的集成(MyBatis 官方提供與 Spring 的整合包);
(5)提供映射標簽,支持物件與資料庫的 ORM 欄位關系映射;提供物件關系映射標簽,支持物件關系組件維護,
缺點:
(1)SQL 陳述句的撰寫作業量較大,尤其當欄位多、關聯表多時,對開發人員撰寫 SQL 陳述句的功底有一定要求,
(2)SQL 陳述句依賴于資料庫,導致資料庫移植性差,不能隨意更換資料庫,
3.MyBatis框架適用場合?
MyBatis 專注于 SQL 自身,是一個足夠靈活的 DAO 層解決方案,對性能的要求很高,或者需求變化較多的專案,例如 Web 專案,互聯網專案等等, MyBatis 都是不錯的選擇,
4.MyBatis框架原理?

-
MyBatis 配置:SqlMapConfig.xml,此檔案作為 MyBatis 的全域組態檔,配置了 MyBatis 的運行環境等資訊,mapper.xml 檔案即 SQL 映射檔案,檔案中配置了操作資料庫的 SQL 陳述句,此檔案需要在 SqlMapConfig.xml 中加載,
-
通過 MyBatis 環境等配置資訊構造 SqlSessionFactory 即會話工廠,
-
由會話工廠創建 sqlSession 即會話,操作資料庫需要通過 sqlSession 進行,
-
MyBatis 底層自定義了 Executor 執行器介面操作資料庫,Executor 介面有兩個實作,一個是基本執行器、一個是快取執行器,
-
Mapped Statement 也是 MyBatis 一個底層封裝物件,它包裝了 MyBatis 配置資訊及 SQL 映射資訊等,mapper.xml 檔案中一個 SQL 對應一個 Mapped Statement 物件,SQL 的 id 即是 Mapped statement 的 id,
-
Mapped Statement 對 SQL 執行輸入引數進行定義,包括 HashMap、基本型別、POJO,Executor 通過 Mapped Statement 在執行 SQL 前將輸入的 Java 物件映射至 SQL 中,輸入引數映射就是 JDBC 編程中對 preparedStatement 設定引數,
-
Mapped Statement 對 SQL 執行輸出結果進行定義,包括 HashMap、基本型別、POJO,Executor 通過 Mapped Statement 在執行 SQL 后將輸出結果映射至 Java 物件中,輸出結果映射程序相當于 JDBC 編程中對結果的決議處理程序,
5.MyBatis和Hibernate的區別?
(1)MyBatis 和 Hibernate 不同,它不是一個完全的 ORM 框架,因為 MyBatis 需要程式員自己撰寫 SQL 陳述句;
(2)MyBatis 直接撰寫原生態 SQL,可以嚴格控制 SQL 執行性能,靈活度高,非常適合對關系資料模型要求不高的軟體開發,因為這類軟體需求變化頻繁,一旦有需求變化可以迅速輸出成果,但是靈活的前提是 MyBatis 無法做到資料庫無關性,如果需要實作支持多種資料庫的軟體,則需要自定義多套 SQL 映射檔案,作業量大,
(3)Hibernate 物件/關系映射能力強,資料庫無關性好,對于關系模型要求高的軟體,如果用 Hibernate 開發可以節省很多代碼,提高效率,
6.MyBatis有哪些動態標簽?
-
if 標簽:判斷是否符合條件
-
foreach 標簽:對一個集合進行遍歷
-
where 標簽:補充回應的 where 的 SQL 陳述句
-
sql 標簽:定義可重用的 SQL 代碼段,可以包含在其他陳述句中,
-
......
7.MyBatis中一對一如何實作?
在映射檔案中 resultMap 元素里配置 association 節點,配置一對一的類就可以完成,
8.MyBatis中一對多如何實作?
在映射檔案中 resultMap 里面配置 collection 節點,配置一對多的類就可以完成,
9.MyBatis編程步驟?
-
創建
SqlSessionFactory會話工廠 -
通過
SqlSessionFactory創建SqlSession會話 -
通過
sqlSession執行資料庫操作 -
通過 `session.commit()`` 提交事務
-
呼叫 `session.close()`` 關倍訓話
10.MyBatis的一級快取和二級快取?
-
Mybatis 首先會到快取中查詢結果集,如果沒有則查詢資料庫,如果有則直接從快取取出結果集,Mybatis 內部存盤快取使用一個 HashMap,key 為 hashCode+sqlId+Sql 陳述句,value 為從查詢出來映射生成的 Java 物件,
-
Mybatis 的一級快取即本地快取,它的作用域是一個 sqlSession 會話,即在同一個 sqlSession 中兩次執行相同的 SQL 陳述句,第一次執行完畢會將資料庫中查詢的資料寫到快取(記憶體),第二次會從快取中獲取資料將不再從資料庫查詢,從而提高查詢效率,
-
Mybatis 的二級快取即查詢快取,它的作用域是一個 mapper 的 namespace,即在同一個 namespace 中查詢相同的 SQL 可以從快取中獲取資料,二級快取是可以跨 SqlSession 的,
11.#{} 和 ${} 區別?
-
#{}表示一個占位符號,可以有效防止sql注入, -
${}表示拼接sql串,在低版本中括號中只能是value, -
#{}表示一個占位符號,通過#{}可以實作preparedStatement向占位符中設定值,自動進行java型別和jdbc型別轉換,#{}可以有效防止sql注入, -
#{}可以接收簡單型別值或pojo屬性值, 如果parameterType傳輸單個簡單型別值,#{}括號中可以是value或其它名稱, -
${}表示拼接sql串,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc型別轉換, -
${}可以接收簡單型別值或pojo屬性值,如果parameterType傳輸單個簡單型別值,低版本中${}括號中只能是value,
12.Mybatis的mapper.xml檔案中常用標簽有哪些?
<select>、<insert>、<update>、<delete>、<sql>、<resultMap>、<set>、<where>...
13.Mybatis的xml映射檔案中,不同的xml映射檔案,id是否可以重復?
不同的xml映射檔案,如果配置了namespace,那么id可以重復;如果沒有配置namespace,那么id不能重復;原因就是namespace+id是作為Map<String, MapperStatement>的key使用的,如果沒有namespace,就剩下id,那么,id重復會導致資料互相覆寫,有了namespace,自然id就可以重復,namespace不同,namespace+id自然也就不同,
備注:在舊版本的Mybatis中,namespace是可選的,不過新版本的namespace已經是必須的了,
14.MyBatis 分頁如何處理?
mybatis分頁查詢有兩種方案:
-
可以通過limit關鍵字拼接SQL陳述句,需要兩個引數,第一個引數為開始條數,第二個引數為查詢個數,
-
可以通過 pageHelper 插件實作:
-
在sqlMapConfig 檔案中配置 mybatis的插件(plugins)
-
在查詢資料前通過 PageHelper.start() 方法,呼叫 PageHelper 插件,引數為當前頁和每頁顯示條數
-
查詢結果會封裝到一個page物件中,包含分頁查詢記錄、總記錄數、總頁數等
-
從page物件中獲取需要的資料
-
15.Mybatis是如何進行分頁的?分頁插件的原理是什么?
Mybatis使用RowBounds物件進行分頁,它是針對ResultSet結果集執行的記憶體分頁,而非物理分頁,可以在sql內直接書寫帶有物理分頁的引數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁,
分頁插件的基本原理是使用mybatis提供的插件介面,實作自定義插件,在插件的攔截方法內攔截待執行的sql,然后重寫sql,根據dialect方言,添加對應的物理分頁陳述句和物理分頁引數,
16.如何獲取自動生成的主鍵?
-
自增主鍵回傳
-
mysql 自增主鍵,執行 insert 提交之前自動生成一個自增主鍵,可以通過 mysql 函式獲取剛插入記錄的自增主鍵:LAST_INSERT_ID(),是在insert之后去呼叫,
<insert id="insertTeacher" parameterType="Teacher" > <selectKey keyProperty="id" resultType="java.lang.Integer" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO teacher (name,idcard,sex) VALUES (#{name},#{idcard},#{sex}) </insert> -
設定insert屬性獲取自增id
<insert id="insertTeacher" parameterType="Teacher" useGeneratedKeys="true" keyProperty="id" > INSERT INTO teacher (name,idcard,sex) VALUES (#{name},#{idcard},#{sex}) </insert>
-
-
非自增主鍵回傳
mysql 使用 uuid 實作主鍵,需要修改表中 id 欄位型別為 varchar,長度至少36位,
執行思路:先通過 uuid() 查詢到主鍵,將主鍵輸入到 SQL 陳述句中,執行 uuid() 陳述句順序相對于 insert陳述句在之前,<!-- 使用mysql的uuid()生成主鍵 執行程序: 首先通過uuid()得到主鍵,將主鍵設定到teacher物件的id屬性中 其次在insert執行時,從teacher物件中取出id屬性值 --> <insert id="insertTeacher" parameterType="Teacher"> <selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE"> SELECT UUID() </selectKey> INSERT INTO teacher (id,name,idcard) VALUES (#{id},#{name},#{idcard}) </insert>
17.在mapper中如何傳遞多個引數?
第一種:直接多個引數
// DAO層 介面
User listUsers(String name, String sex);
<!-- mapper映射檔案
#{0}代表接收dao層方法中的第一個引數,#{1}代表接收第二個引數,更多引數一直往后加即可
-->
<select id="listUsers" resulType="User">
select * from user where name=#{0} and sex=#{1}
</select>
第二種:使用@param注解
// DAO層 介面
User listUsers(@param("uname") String name, @param("usex") String sex);
<!-- mapper映射檔案 -->
<select id="listUsers" resulType="User">
select * from user where name=#{uname} and sex=#{usex}
</select>
第三種:多個引數封裝成map集合
// 映射檔案的命名空間.sql片段的id,就可以呼叫對應的映射檔案的SQL
// 由于引數超過了兩個,而方法中只有一個Object引數收集,因此我們使用Map集合來封裝引數
Map<String, Object> map = new HashMap<>();
map.put("uname", "張三");
map.put("usex", "男");
sqlSession.selectList("user.listUsers", map);
<!-- mapper映射檔案 -->
<select id="listUsers" resulType="User">
select * from user where name=#{uname} and sex=#{usex}
</select>
18.使用mapper介面開發DAO時有哪些要求?
-
Mapper.xml 檔案中的 namespace 與 mapper 介面的類路徑相同,
-
Mapper 介面方法名和 Mapper.xml 中定義的每個 statement 的 id 相同
-
Mapper 介面方法的輸入引數型別和 mapper.xml 中定義的每個 sql 的 parameterType 的型別相同
-
Mapper 介面方法的輸出引數型別和 mapper.xml 中定義的每個 sql 的 resultType 的型別相同
19.MyBatis的組態檔sqlMapConfig.xml中有哪些內容?
配置內容和順序如下:
- configuration(配置)
- properties(屬性)
- settings(全域配置引數)
- typeAliases(型別別名)
- typeHandlers(型別處理器)
- objectFactory(物件工廠)
- plugins(插件)
- environments(環境配置)
- environment(環境變數)
- transactionManager(事務管理器)
- dataSource(資料源)
- databaseIdProvider(資料庫廠商標識)
- mappers(映射器)
20.MyBatis中有哪些重要組件?
MyBatis是一個開源的Java持久化框架,它可以輕松訪問關系資料庫,將SQL陳述句和資料映射到Java物件中,并提供了很多高級特性,下面是MyBatis中的幾個重要組件:
-
SqlSession:SqlSession是MyBatis的核心介面之一,其作用相當于對JDBC操作的封裝,SqlSession提供了執行SQL陳述句、提交事務、獲取Mapper映射器等操作,
-
Configuration:Configuration是MyBatis的全域配置類,它負責決議和管理MyBatis的組態檔,并提供了許多高級特性,如快取配置、型別別名配置、插件配置等,
-
Mapper映射器:Mapper映射器是MyBatis中用于映射Java方法與SQL陳述句的方法,通過Mapper映射器,可以將Java方法和SQL陳述句系結在一起,從而輕松地在Java中執行SQL陳述句,
-
Executor:Executor是MyBatis中用于執行SQL陳述句的核心介面,它負責從SqlSession中接收SQL陳述句并執行它們,同時還負責快取結果、處理事務等操作,
-
TypeHandler:TypeHandler是MyBatis中的重要組件之一,它負責將Java物件和資料庫中的資料進行轉換,MyBatis中默認提供了很多TypeHandler,同時也支持自定義TypeHandler,
這些組件構成了MyBatis框架的核心,并提供了許多高效、易用、可擴展的特性,使開發人員可以輕松地進行資料訪問和持久化操作,
關注公眾號:編程火箭車
我們定期發布編程相關的文章、資訊、活動等內容,幫助編程愛好者、初學者或初級程式員快速入門、打牢基礎,歡迎大家關注,和我們一起探索編程的精彩世界,我們定期發布編程相關的文章、資訊、活動等內容,幫助編程愛好者、初學者或初級程式員快速入門、打牢基礎,歡迎大家關注,和我們一起探索編程的精彩世界,
本文來自博客園,作者:編程火箭車,轉載請注明原文鏈接:https://www.cnblogs.com/coding-rocket/p/17439976.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/553730.html
標籤:其他
下一篇:返回列表
