前言
Java程式員以前連接資料庫是這樣的
現在連接資料庫是這樣的
在傳統的JDBC 實作中,我們需要把查詢程序寫在Java 類中,這樣非常不便于后期維護,而使用Mybatis 則可以將查詢陳述句配置在組態檔中,只需要維護好映射關系即可,
Mybatis是一個開源的輕量級半自動化ORM框架,使得面向物件應用程式與關系資料庫的映射變得更加容易,熟悉Mybatis的都知道,其原始碼里涉及到非常多的設計模式,比如
設計模式
Builder模式**:**例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
**工廠模式:**例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
**單例模式:**例如ErrorContext和LogFactory;
**代理模式:**Mybatis實作的核心,比如MapperProxy、ConnectionLogger,用的jdk的動態代理;還有executor.loader 包 使用了cglib或者javassist達到延遲加載的效果;
**組合模式:**例如SqlNode和各個子類ChooseSqlNode等;
**模板方法模式:**例如BaseExecutor和SimpleExecutor,還有BaseTypeHandler和所有的子類例如IntegerTypeHandler;
**配接器模式:**例如Log的Mybatis介面和它對jdbc、log4j等各種日志框架的適配實作;
**裝飾者模式:**例如Cache包中的cache.decorators子包中等各個裝飾者的實作;
**迭代器模式:**例如迭代器模式PropertyTokenizer;
關注公眾號“程式員白楠楠”獲取一份562頁的設計模式資料
如果之前只會使用或者沒有看過Mybatis原始碼,那看到上面這些設計模式可能會有點懵逼,Mybatis用了這么多年了,只會用它來CRUD資料庫嗎?其底層的架構設計與原始碼分析,如何連接資料庫的?如何執行的?一二級快取的作用?sql如何決議的?原始碼中設計到的設計模式......這些技術點都會嗎?
Mybatis原始碼分析
今天,我們就來看看Mybatis原始碼的閱讀,具體舉個例子來看看:
案例和疑問
從我們最初的demo中開始:
public static void main(String[] args) {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
SqlSession sqlSession = null;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectById", 1);
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
sqlSession.close();
}
}
關于獲取資料流inputStream,這個我們就不討論了,我們主要關注重點,
對于上面demo,我們可以分成五個步驟:
第一步,創建一個工廠類sqlSessionFactory,
組態檔的決議就是在這里完成的,包括mybatis-config.xml和我們的Mapper.xml映射器檔案,這一步我們關心的內容是:決議的時候做了什么?產生了什么物件,決議的結果放在哪里的,因為這將意味著,我們后面使用的時候去哪里獲取這項配置項內容,
第二步,通過SqlSessionFactory創建一個SqlSession,
那么問題來了,SqlSession中定義了各種增刪改查的API,是給客戶端呼叫,回傳的是什么實作類?除了SqlSession以外,我們還創建了什么物件,創建了什么環境?
第三步,獲取到一個Mapper物件,
問題來了UserMapper.java是一個介面,并沒有為它創建實作類,那又是怎么被實體化的呢?我們使用的這個Mapper物件到底是什么物件呢?為什么要從SqlSession里去獲取呢?為什么傳進去一個介面,然后還要用一個介面去接收呢?
第四步,呼叫介面方法,
問題是我們的介面沒有實作類,為什么就可以直接呼叫它的方法呢?那它呼叫的是誰的方法呢?是如何把SQL給關聯起來的呢?是如何獲取到資料的呢?
第五步,關閉相關資源,
開始原始碼分析程序
由于涉及到內容較多,下面就用幾張圖來展示整個流程,我們可以通過這幾張圖來快速翻閱Mybatis的原始碼,
第一步
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
這一句代碼的整個流程如下:
根據inputStream,決議組態檔,創建出一個DefaultSqlSessionFactory默認的SqlSessionFactory 實作類,構建出一個工廠類,這個工廠類專門用來創建SqlSession物件的,
第二步
SqlSession sqlSession = sqlSessionFactory.openSession();
獲取SqlSession的整個流程如下:
第三步
User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectById", 1);
第三步和第四步就是這行代碼畫的,
這一步是回傳一個映射器代理類,映射器代理類專門用來給UserMapper介面和UserMapper.xml系結的代理類,創建出來的代理類就可以實體化了,然后就可以呼叫UserMapper介面的方了,
第四步:呼叫代理物件執行SQL的整個程序,
第五步,關閉資源,
希望大家按照這個流程,找點原始碼看看,聽別人的看別人永遠是別人的,
動起來吧!
個人建議
對于一般java程式員來說,閱讀原始碼之前到底需要些什么技能呢?
個人建議,以下基礎知識必須會一些:
會設計模式:包括單例模式、工廠模式、代理模式、裝飾器模式、責任鏈模式、模板方法模式等,
會猜測:大膽的猜測,在看原始碼的時候,多站在高層次想想,如果你是Mybatis的設計者,你會怎么設計?
總結
Mybatis應該是國內用得最多的「資料訪問層」框架了,看了我司的好幾個系統,基本都是用Mybatis,所以深入了解Mybatis的重要性不言而喻,
小編總結一份562頁的設計模式資料, 這份資料非常全面且詳細,覆寫了 設計模式 基礎學習的方方面面,非常適合初學者入門!
資料獲取方式:關注公眾號“程式員白楠楠”獲取上述資料!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/238921.html
標籤:其他
上一篇:Java基礎之:日期類
