**十三、Mybatis**
**125\. mybatis 中 #{}和 ${}的區別是什么?**
* #{}是預編譯處理,${}是字符串替換;
* Mybatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值;
* Mybatis在處理${}時,就是把${}替換成變量的值;
* 使用#{}可以有效的防止SQL注入,提高系統安全性。
**126\. mybatis 有幾種分頁方式?**
1. # 數組分頁
2. # sql分頁
3. # 攔截器分頁
4. # RowBounds分頁
**128\. mybatis 邏輯分頁和物理分頁的區別是什么?**
* 物理分頁速度上并不一定快于邏輯分頁,邏輯分頁速度上也并不一定快于物理分頁。
* 物理分頁總是優于邏輯分頁:沒有必要將屬于數據庫端的壓力加諸到應用端來,就算速度上存在優勢,然而其它性能上的優點足以彌補這個缺點。
**129\. mybatis 是否支持延遲加載?延遲加載的原理是什么?**
Mybatis僅支持association關聯對象和collection關聯集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false。
它的原理是,使用CGLIB創建目標對象的代理對象,當調用目標方法時,進入攔截器方法,比如調用a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那么就會單獨發送事先保存好的查詢關聯B對象的sql,把B查詢上來,然后調用a.setB(b),于是a的對象b屬性就有值了,接著完成a.getB().getName()方法的調用。這就是延遲加載的基本原理。
當然了,不光是Mybatis,幾乎所有的包括Hibernate,支持延遲加載的原理都是一樣的。
**130\. 說一下 mybatis 的一級緩存和二級緩存?**
一級緩存: 基于 PerpetualCache 的 HashMap 本地緩存,其存儲作用域為 Session,當 Session flush 或 close 之后,該 Session 中的所有 Cache 就將清空,默認打開一級緩存。
二級緩存與一級緩存其機制相同,默認也是采用 PerpetualCache,HashMap 存儲,不同在于其存儲作用域為 Mapper(Namespace),并且可自定義存儲源,如 Ehcache。默認不打開二級緩存,要開啟二級緩存,使用二級緩存屬性類需要實現Serializable序列化接口(可用來保存對象的狀態),可在它的映射文件中配置 ;
對于緩存數據更新機制,當某一個作用域(一級緩存 Session/二級緩存Namespaces)的進行了C/U/D 操作后,默認該作用域下所有 select 中的緩存將被 clear。
**131\. mybatis 和 hibernate 的區別有哪些?**
(1)Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程序員自己編寫Sql語句。
(2)Mybatis直接編寫原生態sql,可以嚴格控制sql執行性能,靈活度高,非常適合對關系數據模型要求不高的軟件開發,因為這類軟件需求變化頻繁,一但需求變化要求迅速輸出成果。但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件,則需要自定義多套sql映射文件,工作量大。?
(3)Hibernate對象/關系映射能力強,數據庫無關性好,對于關系模型要求高的軟件,如果用hibernate開發可以節省很多代碼,提高效率。?
**132\. mybatis 有哪些執行器(Executor)?**
#### Mybatis有三種基本的執行器(Executor):
1. **SimpleExecutor**:每執行一次update或select,就開啟一個Statement對象,用完立刻關閉Statement對象。
2. **ReuseExecutor**:執行update或select,以sql作為key查找Statement對象,存在就使用,不存在就創建,用完后,不關閉Statement對象,而是放置于Map內,供下一次使用。簡言之,就是重復使用Statement對象。
3. **BatchExecutor**:執行update(沒有select,JDBC批處理不支持select),將所有sql都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象,每個Statement對象都是addBatch()完畢后,等待逐一執行executeBatch()批處理。與JDBC批處理相同。
**133\. mybatis 分頁插件的實現原理是什么?**
分頁插件的基本原理是使用Mybatis提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,然后重寫sql,根據dialect方言,添加對應的物理分頁語句和物理分頁參數。
**134\. mybatis 如何編寫一個自定義插件?**
轉自:blog.csdn.net/qq\_30051265/article/details/80266434
Mybatis自定義插件針對Mybatis四大對象(Executor、StatementHandler 、ParameterHandler 、ResultSetHandler )進行攔截,具體攔截方式為:?
* Executor:攔截執行器的方法(log記錄)?
* StatementHandler :攔截Sql語法構建的處理?
* ParameterHandler :攔截參數的處理?
* ResultSetHandler :攔截結果集的處理?
Mybatis自定義插件必須實現Interceptor接口:
~~~
public interface Interceptor {
~~~
> intercept方法:攔截器具體處理邏輯方法?
>
> plugin方法:根據簽名signatureMap生成動態代理對象?
>
> setProperties方法:設置Properties屬性
自定義插件demo:
~~~
// ExamplePlugin.java
~~~
一個@Intercepts可以配置多個@Signature,@Signature中的參數定義如下:?
* type:表示攔截的類,這里是Executor的實現類;
* method:表示攔截的方法,這里是攔截Executor的update方法;
* args:表示方法參數。
- 空白目錄
- Java 最常見的 208 道面試題:第一模塊答案
- Java 最常見的 208 道面試題:第二模塊答案
- Java 最常見的 208 道面試題:第三模塊答案
- Java 最常見的 208 道面試題:第四模塊和第五模塊答案
- Java 最常見的 208 道面試題:第六模塊答案
- Java 最常見的 208 道面試題:第七模塊答案
- Java 最常見的 208 道面試題:第八模塊答案
- Java 最常見的 208 道面試題:第九模塊和第十模塊答案
- Java 最常見的 208 道面試題:第十一模塊答案
- Java 最常見的 208 道面試題:第十二模塊答案
- Java 最常見的 208 道面試題:第十三模塊答案
- Java 最常見的 208 道面試題:第十四模塊答案
- Java 最常見的 208 道面試題:第十五模塊答案
- Java 最常見的 208 道面試題:第十六模塊答案
- ava 最常見的 208 道面試題:第十七模塊答案
- Java 最常見的 208 道面試題:第十八模塊答案
- Java 最常見的 208 道面試題:第十九模塊答案
- 關于暑假自學內容