Java開發工程師最新面試題庫系列——Mybatis框架部分(附答案)
Mybatis
-
Mybatis是什麼框架?
答:持久層框架
-
Mybatis和ORM有什麼區別?
答:ORM是對象關係映射的一種設計理念,也就是對象屬性對應數據庫字段,讓開發人員以操作對象的方式操作數據庫數據。Mybatis是基於ORM框架實現的持久層框架,但它並是不完全ORM,Mybatis只是將對象與sql語句關聯起來了,而不是與數據庫數據關聯;
-
Mybatis為什麼是半自動ORM映射?
答:Mybatis只是將對象與sql語句關聯起來了,而不是與數據庫數據關聯。因此需要手動編寫SQL語句,所以是半自動ORM映射。
-
Mybatis框架的應用場景?
答:對SQL語句的查詢性能要求比較高的地方,例如需要在查詢時帶上某個索引字段條件,以此來優化查詢性能。
-
Mybatis有哪些優缺點?
答:
1.sql語句與代碼分離,存放於xml配置文件中:
優點:便於維護管理,不用在java代碼中找這些語句;
缺點: JDBC方式可以用用打斷點的方式調試,但是Mybatis不能,需要通過log4j日誌輸出日誌信息幫助調試,然後在配置文件中修改。
2.用邏輯標籤控制動態SQL的拼接:
優點:用標籤代替編寫邏輯代碼;
缺點:拼接複雜SQL語句時,沒有代碼靈活,拼寫比較複雜。不要使用變通的手段來應對這種複雜的語句。
3.查詢的結果集與java對象自動映射:
優點:保證名稱相同,配置好映射關係即可自動映射或者,不配置映射關係,通過配置列名=字段名也可完成自動映射。
缺點:對開發人員所寫的SQL依賴很強。
4.編寫原聲SQL:
優點:接近JDBC,比較靈活。
缺點:對SQL語句依賴程度很高;並且屬於半自動,數據庫移植比較麻煩,比如mysql數據庫編程Oracle數據庫,部分的sql語句需要調整。
-
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開發周期短,能夠快速開發。
-
Mybatis有哪幾種SQL編寫形式?
答:
1、xml靜態SQL編寫
2、xml動態SQL編寫
3、註解@Select標記在方法上 編寫SQL
-
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>
-
Mybatis的$和#傳參的區別?
答:${}是將參數與sql語句進行字符串拼接,不可避免的會代碼SQL注入問題。安全性差,但可以通過一些手段來規避例如:正則表達式過濾不安全字符。#{}是將參數替換成?,之後與PerpardStatement進行SQL預編譯的方式進行參數設置.
-
Mybatis可以映射到枚舉類嗎?
答:可以,需要自定義對枚舉類的類型轉換器。例如寫一個類為EnumTypeHandler繼承BaseTypeHandler<枚舉類型>,重寫其中的方法,在getNullableResult方法中更具返回結果做響應的轉換操作。
-
Mybatis怎麼封裝動態SQL?
答:
-
Mybatis的trim標籤有什麼作用?
答: trim標記是一個格式化的標記,可以完成set或者是where標記的功能,它的參數有prefix前綴,prefixOverrides匹配前置去除,suffix後綴,suffixOverrides匹配後綴去除
-
Mybatis怎麼實現分頁?
答:
1、使用SQL的LIMIT做分頁,分頁參數可以使用Mybatis提供的Page封裝,傳給Mapper。然後使用LIMIT (page-1)*size,size方式查詢數據
2、使用PageHelper插件實現
3、使用Mybatis的Interceptor攔截器實現
-
Mybatis的流式查詢有什麼作用?
答:
流式查詢指的是查詢成功後不是返回一個集合而是返回一個迭代器,應用每次從迭代器取一條查詢結果。流式查詢的好處是能夠降低內存使用。
如果沒有流式查詢,我們想要從數據庫取 1000 萬條記錄而又沒有足夠的內存時,就不得不分頁查詢,而分頁查詢效率取決於表設計,如果設計的不好,就無法執行高效的分頁查詢。因此流式查詢是一個數據庫訪問框架必須具備的功能。
流式查詢的過程當中,數據庫連接是保持打開狀態的,因此要注意的是:執行一個流式查詢後,數據庫訪問框架就不負責關閉數據庫連接了,需要應用在取完數據後自己關閉。
-
Mybatis模糊查詢LIKE語句應該怎麼寫?
答:
1、${%field%}:存在SQL注入問題,不推薦
2、”%”#{field}”%”
3、CONCAT(‘%’,#{field},’%’)
4、bind標籤了解
-
Mybatis配置文件中的SQL id是否能重複?
答:同一個namespace下是不能重複的
-
Mybatis如何防止SQL注入?
答:
1、使用#{}來設置參數
2、正則表達式過濾非法字符
-
Mybatis如何實現主鍵回填?
答:使用useGeneratedKeys=”true”,標識開啟主鍵回填,keyProperty=”id”指定主鍵回填設置到哪一個屬性。
<insert id="insertBook" useGeneratedKeys="true" keyProperty="id"> insert into t_book (b_name,author) values (#{name},#{author}); </insert>
-
Mybatis使用了哪些設計模式?
答:
- Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
- 工廠模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
- 單例模式,例如ErrorContext和LogFactory;
- 代理模式,Mybatis實現的核心,比如MapperProxy、ConnectionLogger,用的jdk的動態代理;還有executor.loader包使用了cglib或者javassist達到延遲加載的效果;
- 組合模式,例如SqlNode和各個子類ChooseSqlNode等;
- 模板方法模式,例如BaseExecutor和SimpleExecutor,還有BaseTypeHandler和所有的子類例如IntegerTypeHandler;
- 適配器模式,例如Log的Mybatis接口和它對jdbc、log4j等各種日誌框架的適配實現;
-
Mybatis的緩存機制有什麼作用?
答:做服務器的進程內部緩存,提高查詢效率,降低數據庫訪問頻率。Mybatis有三種緩存,一級緩存、二級緩存、第三方緩存EhCache,一級緩存時默認開啟的,作用域時SqlSession。二級緩存默認關閉需要在配置中使用enableCache=”true”開啟,二級緩存時namespace作用域的。第三方緩存需要引入額外Jar包,並且在配置中開啟二級緩存開關,配置第三方緩存的核心類。
-
Mybatis一級緩存和二級緩存有什麼區別?
答:
1、作用域不同:
一級緩存的作用域是SqlSession級別的Map,二級緩存是namespace級別的,也叫全局緩存
2、默認配置不同
一級緩存默認開啟,二級緩存默認關閉,需要在mybatis.cfg.xml配置文件中開啟
<settings> <setting name="cacheEnabled" value="true"/> </settings
-
Mybatis-plus和TK-Mybatis是什麼框架?
答:Mybatis的增強框架,幫助開發人員更加簡化開發。這些框架提供了大部分的簡單SQL語句封裝的API,提供了分頁插件,簡化了配置流程。不過只對單表有好的支持,多表關聯查詢支持差,一般需要手動編寫多表的SQL,不過可以原生和增強一起使用。