天天看點

Mybatis架構(二)-- 原了解析

Mybatis架構(一)-- 快速入門

Mybatis架構(二)-- 原了解析

Mybatis架構(三)-- 詳細配置參數

Mybatis架構(四)-- 其他配置

Mybatis架構(五)-- 多表查詢

Mybatis架構(六)-- 延遲加載

Mybatis架構(七)-- 緩存

Mybatis架構(八)-- 注解開發

文章目錄

    • Mybatis架構所使用的資源
    • Mybatis執行原理
    • 動态代理過程

Mybatis架構所使用的資源

1 總配置檔案

  • 包含連接配接資料庫的四個參數
  • 包含mappers映射配置檔案(每個dao層接口的配置檔案)的目錄

2 映射配置檔案Mapper

  • 包含對應方法需要用到的Sql語句
  • 包含對應方法傳回值的全限定類名封裝結果的接收JavaBean類型(domain層)

Mybatis執行原理

  1. 解析配置檔案,根據配置檔案的資訊建立Connection對象注冊驅動,獲得連接配接。
  2. 擷取與處理對象

    PreparedStatement

    對象 conn.prepareStatement(Sql語句)
  3. 執行查詢

    ResultSet rs = preparedStatement.executeQuery();

  4. 周遊結果集,用于封裝 (通過傳回值的全限定類名)。
通過傳回值的全限定類名建立List集合 E為傳回值類型
List<E> list = new ArrayList();
while(rs.next()){
	通過反射-建立E類型的對象,
	E element = (E)Class.forName(傳回值的全限定類名).newInstance();
	
	将資料庫傳回的一條資料封裝到element中,并添加到list中
	
	因為我們的實體類E 和 表中的列名是一緻的。
	于是我們就可以把表的列名看成是實體類的屬性名稱。
	通過反射機制就可以把表中每條資料指派到E執行個體對象的對應屬性中
	
	list.add(element);
}
           

反射機制詳解

5.傳回List集合

動态代理過程

要詳細了解Mybatis的實作,請先了解動态代理 – 代理模式

我們在抽象層次上了解動态代理與Mybatis架構的關系:

由于所有的Select語句都是向資料庫發送Select語句并傳回資料,隻有Select語句和用于接收資料的JavaBean不同,使用動态代理對相同動作進行統一封裝,不同之處使用動态代理進行增強。

首先定義一個接口裡面包含要用到的方法 例如 (非真實代碼,僅提供思路)

public interface SelectInterface
{
	List<T> select(); //通過sql語句傳回資料,sql語句可通過配置檔案或注解讀取
}
           

通過動态代理傳回執行個體

SelectInterface SelectProxy = Proxy.newProxyInstance(this.getClass().getClassLoader(), SelectInterface.class, InvocationHandler h);

然後再執行
SelectProxy.select();
即可完成查詢
           

關鍵的是InvocationHandler h中做了什麼

InvocationHandler h InvocationHandler{
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)  {
    
	1.	根據配置檔案的資訊注冊驅動,獲得連接配接Connection對象。
		根據配置檔案或注解,獲得sql語句
	  	擷取預處理對象 PreparedStatement conn.prepareStatement(Sql語句)
		 執行查詢    ResultSet rs = preparedStatement.executeQuery();`
    
    2.  通過 傳回值的全限定類名--returnType 或注解Sql語句所綁定的方法,得到傳回值類型
		周遊結果集,進行封裝
		(通過反射可以得到傳回類型的屬性個數fields,再通過屬性名與表中列名相同可以一一指派)
        
    3.  傳回結果集合List
    }
}
           

繼續閱讀