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,不過可以原生和增強一起使用。