-
mybatis 中 #{}和 ${}的區別是什麼?
#{}將傳入的數據都當成一個字符串;方式能夠很大程度防止sql注入;一般用於傳入數據庫對象
而不是# -
mybatis 有幾種分頁方式?
數組分頁、sql分頁、攔截器分頁、RowBounds分頁 -
RowBounds 是一次性查詢全部結果嗎?爲什麼?
是的。因爲RowBounds 採用的是邏輯分頁,他將所有的分頁信息查出來後在進行分頁。 -
mybatis 邏輯分頁和物理分頁的區別是什麼?
邏輯分頁:即雖然看起來實現了分頁的功能,但實際上是將查詢的所有結果放置在內存中,每次都從內存獲取。
物理分頁:這種分頁方法從底層上就是每次只查詢對應條目數量的數據,從而實現了真正意義上的分頁。 -
mybatis 是否支持延遲加載?延遲加載的原理是什麼?
支持。將採用高級映射實現多表聯查時向數據庫發出的SQL語句拆分成若干條單表查詢的SQL語句,當需要返回數據時纔會向數據庫發出只針對當前數據的SQL語句。 -
說一下 mybatis 的一級緩存和二級緩存?
一級緩存是SqlSession級別的緩存。在操作數據庫時需要構造 sqlSession對象,在對象中有一個(內存區域)數據結構(HashMap)用於存儲緩存數據。不同的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。
二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession去操作數據庫得到數據會存在二級緩存區域,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。 -
mybatis 和 hibernate 的區別有哪些?
mybatis:1、入門簡單,即學即用 2、可以進行更爲細緻的SQL優化,可以減少查詢字段 3、缺點就是框架還是比較簡陋,功能尚有缺 4、二級緩存機制不佳
hibernate :1、功能強大,數據庫無關性好,O/R映射能力強2、有更好的二級緩存機制,可以使用第三方緩存 3、缺點就是學習門檻不低,要精通門檻更高 -
mybatis 有哪些執行器(Executor)?
SimpleExecutor、ReuseExecutor、BatchExecutor -
mybatis 分頁插件的實現原理是什麼?
在四大對象創建的時候
1、每個創建出來的對象不是直接返回的,而是
interceptorChain.pluginAll( parameterHandler )2、獲取到所有的interceptor(基於攔截器原理)(插件需要實現的接口)
調用所有的Interceptor.pluginAll(target);返回target包裝後的對象
3、插件機制,我們可以使用插件爲目標對象創建一個代理對象:AOP(面向切面的方式)
我們的插件可以爲四大對象創建出代理對象
代理對象就可以攔截到四大對象的每一個執行方法 -
mybatis 如何編寫一個自定義插件?
1). 編寫Interceptor的實現類
2). 使用@Intercepts註解完成插件簽名 說明插件的攔截四大對象之一的哪一個對象的哪一個方法
3). 將寫好的插件註冊到全局配置文件中
@Intercepts({
@Signature(type=StatementHandler.class,method="parameterize",args=java.sql.Statement.class)
})
public class MyfirstPlugin implements Interceptor {
/**
* 攔截目標對象的目標方法的執行;
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
// TODO Auto-generated method stub
System.out.println("要攔截的方法"+invocation+invocation.getMethod());
Object prObject = invocation.proceed();
return prObject;
}
/**
* 包裝目標對象的:包裝:爲目標對象創建一個代理對象
*/
@Override
public Object plugin(Object target) {
// TODO Auto-generated method stub
System.out.println("包裝的對象"+target.toString());
Object wrap = Plugin.wrap(target, this);
return wrap;
}
/**
* setProperties:
* 將插件註冊時 的property屬性設置進來
*/
@Override
public void setProperties(Properties properties) {
// TODO Auto-generated method stub
System.out.println(properties);
}
}
全局配置文件:
<plugins>
<plugin interceptor="dao.MyfirstPlugin">
<property name="root" value="jjc"/>
<property name="pwdword" value="123456"/>
</plugin>
</plugins>