Mybatis架構(一)-- 快速入門
Mybatis架構(二)-- 原了解析
Mybatis架構(三)-- 詳細配置參數
Mybatis架構(四)-- 其他配置
Mybatis架構(五)-- 多表查詢
Mybatis架構(六)-- 延遲加載
Mybatis架構(七)-- 緩存
Mybatis架構(八)-- 注解開發
文章目錄
-
- Mybatis架構所使用的資源
- Mybatis執行原理
- 動态代理過程
Mybatis架構所使用的資源
1 總配置檔案
- 包含連接配接資料庫的四個參數
- 包含mappers映射配置檔案(每個dao層接口的配置檔案)的目錄
2 映射配置檔案Mapper
- 包含對應方法需要用到的Sql語句
- 包含對應方法傳回值的全限定類名封裝結果的接收JavaBean類型(domain層)
Mybatis執行原理
- 解析配置檔案,根據配置檔案的資訊建立Connection對象注冊驅動,獲得連接配接。
- 擷取與處理對象
對象 conn.prepareStatement(Sql語句)PreparedStatement
- 執行查詢
ResultSet rs = preparedStatement.executeQuery();
- 周遊結果集,用于封裝 (通過傳回值的全限定類名)。
通過傳回值的全限定類名建立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
}
}