java面試---Mybatis

  1. mybatis 中 #{}和 ${}的區別是什麼?
    #{}將傳入的數據都當成一個字符串;方式能夠很大程度防止sql注入;一般用於傳入數據庫對象
    sql;Sql;MyBatis使orderby{}將傳入的數據直接顯示生成在sql中;方式無法防止Sql注入;MyBatis排序時使用order by 動態參數時需要注意,用而不是#

  2. mybatis 有幾種分頁方式?
    數組分頁、sql分頁、攔截器分頁、RowBounds分頁

  3. RowBounds 是一次性查詢全部結果嗎?爲什麼?
    是的。因爲RowBounds 採用的是邏輯分頁,他將所有的分頁信息查出來後在進行分頁。

  4. mybatis 邏輯分頁和物理分頁的區別是什麼?
    邏輯分頁:即雖然看起來實現了分頁的功能,但實際上是將查詢的所有結果放置在內存中,每次都從內存獲取。
    物理分頁:這種分頁方法從底層上就是每次只查詢對應條目數量的數據,從而實現了真正意義上的分頁。

  5. mybatis 是否支持延遲加載?延遲加載的原理是什麼?
    支持。將採用高級映射實現多表聯查時向數據庫發出的SQL語句拆分成若干條單表查詢的SQL語句,當需要返回數據時纔會向數據庫發出只針對當前數據的SQL語句。

  6. 說一下 mybatis 的一級緩存和二級緩存?
    一級緩存是SqlSession級別的緩存。在操作數據庫時需要構造 sqlSession對象,在對象中有一個(內存區域)數據結構(HashMap)用於存儲緩存數據。不同的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。
     二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession去操作數據庫得到數據會存在二級緩存區域,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。

  7. mybatis 和 hibernate 的區別有哪些?
    mybatis:1、入門簡單,即學即用 2、可以進行更爲細緻的SQL優化,可以減少查詢字段 3、缺點就是框架還是比較簡陋,功能尚有缺 4、二級緩存機制不佳
    hibernate :1、功能強大,數據庫無關性好,O/R映射能力強2、有更好的二級緩存機制,可以使用第三方緩存 3、缺點就是學習門檻不低,要精通門檻更高

  8. mybatis 有哪些執行器(Executor)?
    SimpleExecutor、ReuseExecutor、BatchExecutor

  9. mybatis 分頁插件的實現原理是什麼?
    在四大對象創建的時候
    1、每個創建出來的對象不是直接返回的,而是
    interceptorChain.pluginAll( parameterHandler )

    2、獲取到所有的interceptor(基於攔截器原理)(插件需要實現的接口)
    調用所有的Interceptor.pluginAll(target);返回target包裝後的對象
    3、插件機制,我們可以使用插件爲目標對象創建一個代理對象:AOP(面向切面的方式)
    我們的插件可以爲四大對象創建出代理對象
    代理對象就可以攔截到四大對象的每一個執行方法

  10. 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>  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章