1. 程式人生 > >Mybatis ----- 面試(三) 【摘抄】

Mybatis ----- 面試(三) 【摘抄】

摘自下面公眾號,記錄方便學習

Mybatis中如何執行批處理?

使用BatchExecutor完成批處理。

Mybatis都有哪些Executor執行器?它們之間的區別是什麼?

Mybatis有三種基本的Executor執行器,SimpleExecutor、ReuseExecutor、BatchExecutor。

SimpleExecutor:每執行一次update或select,就開啟一個Statement物件,用完立刻關閉Statement物件。

ReuseExecutor:執行update或select,以sql作為key查詢Statement物件,存在就使用,不存在就建立,用完後,不關閉Statement物件,而是放置於Map<String, Statement>內,供下一次使用。簡言之,就是重複使用Statement物件。

BatchExecutor:執行update(沒有select,JDBC批處理不支援select),將所有sql都新增到批處理中(addBatch()),等待統一執行(executeBatch()),它快取了多個Statement物件,每個Statement物件都是addBatch()完畢後,等待逐一執行executeBatch()批處理。與JDBC批處理相同。

作用範圍:Executor的這些特點,都嚴格限制在SqlSession生命週期範圍內。

Mybatis中如何指定使用哪一種Executor執行器?

在Mybatis配置檔案中,可以指定預設的ExecutorType執行器型別,也可以手動給DefaultSqlSessionFactory的建立SqlSession的方法傳遞ExecutorType型別引數。

Mybatis是否可以對映Enum列舉類?

Mybatis可以對映列舉類,不單可以對映列舉類,Mybatis可以對映任何物件到表的一列上。對映方式為自定義一個TypeHandler,實現TypeHandler的setParameter()和getResult()介面方法。

TypeHandler有兩個作用,一是完成從javaType至jdbcType的轉換,二是完成jdbcType至javaType的轉換,體現為setParameter()和getResult()兩個方法,分別代表設定sql問號佔位符引數和獲取列查詢結果。

Mybatis對映檔案中,如果A標籤通過include引用了B標籤的內容,請問,B標籤能否定義在A標籤的後面,還是說必須定義在A標籤的前面?

雖然Mybatis解析Xml對映檔案是按照順序解析的,但是,被引用的B標籤依然可以定義在任何地方,Mybatis都可以正確識別。

原理是,Mybatis解析A標籤,發現A標籤引用了B標籤,但是B標籤尚未解析到,尚不存在,此時,Mybatis會將A標籤標記為未解析狀態,然後繼續解析餘下的標籤,包含B標籤,待所有標籤解析完畢,Mybatis會重新解析那些被標記為未解析的標籤,此時再解析A標籤時,B標籤已經存在,A標籤也就可以正常解析完成了。

簡述Mybatis的Xml對映檔案和Mybatis內部資料結構之間的對映關係?

Mybatis將所有Xml配置資訊都封裝到All-In-One重量級物件Configuration內部。在Xml對映檔案中,<parameterMap>標籤會被解析為ParameterMap物件,其每個子元素會被解析為ParameterMapping物件。

<resultMap>標籤會被解析為ResultMap物件,其每個子元素會被解析為ResultMapping物件。

每一個<select>、<insert>、<update>、<delete>標籤均會被解析為MappedStatement物件,標籤內的sql會被解析為BoundSql物件。

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

1、資料庫連結建立、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用資料庫連結池可解決此問題。

解決:在SqlMapConfig.xml中配置資料鏈接池,使用連線池管理資料庫連結。

2、Sql語句寫在程式碼中造成程式碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java程式碼。

解決:將Sql語句配置在XXXXmapper.xml檔案中與java程式碼分離。

3、向sql語句傳引數麻煩,因為sql語句的where條件不一定,可能多也可能少,佔位符需要和引數一一對應。 

解決: Mybatis自動將java物件對映至sql語句。

4、對結果集解析麻煩,sql變化導致解析程式碼變化,且解析前需要遍歷,如果能將資料庫記錄封裝成pojo物件解析比較方便。

解決:Mybatis自動將sql執行結果對映至java物件。

MyBatis程式設計步驟是什麼樣的?

1、 建立SqlSessionFactory

2、 通過SqlSessionFactory建立SqlSession

3、 通過sqlsession執行資料庫操作

4、 呼叫session.commit()提交事務

5、 呼叫session.close()關閉會話

 MyBatis與Hibernate有哪些不同?

1.Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程式設計師自己編寫Sql語句。

mybatis可以通過XML或註解方式靈活配置要執行的sql語句,並將java物件和sql語句對映生成最終執行的sql,最後將sql執行的結果再對映生成java物件。

2.Mybatis學習門檻低,簡單易學,程式設計師直接編寫原生態sql,可嚴格控制sql執行效能,靈活度高,非常適合對關係資料模型要求不高的軟體開發。

例如網際網路軟體、企業運營類軟體等,因為這類軟體需求變化頻繁,一但需求變化要求成果輸出迅速。

但是靈活的前提是mybatis無法做到資料庫無關性,如果需要實現支援多種資料庫的軟體則需要自定義多套sql對映檔案,工作量大。

3.Hibernate物件/關係對映能力強,資料庫無關性好,對於關係模型要求高的軟體(例如需求固定的定製化軟體)如果用hibernate開發可以節省很多程式碼,提高效率。

但是Hibernate的學習門檻高,要精通門檻更高,而且怎麼設計O/R對映,在效能和物件模型之間如何權衡,以及怎樣用好Hibernate需要具有很強的經驗和能力才行。

總之,按照使用者的需求在有限的資源環境下只要能做出維護性、擴充套件性良好的軟體架構都是好架構,所以框架只有適合才是最好。 

使用MyBatis的mapper介面呼叫時有哪些要求?

1、Mapper介面方法名和mapper.xml中定義的每個sql的id相同。

2、Mapper介面方法的輸入引數型別和mapper.xml中定義的每個sql 的parameterType的型別相同。

3、Mapper介面方法的輸出引數型別和mapper.xml中定義的每個sql的resultType的型別相同。

4、Mapper.xml檔案中的namespace即是mapper介面的類路徑。