一、簡介
先看看Mybatis的源碼結構圖,Mybatis3.2.7版本包含的包共計19個,其他版本可能會少。
每個基于 MyBatis 的應用都是以一個 SqlsessionFactory 的實例為中心的,SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 獲得,而 SqlSessionFactoryBuilder 則可以從 xml 配置文件或一個預先定制的 Configuration 的實例構建出 SqlSessionFactory 的實例。獲取SqlSessionFactory 之后便可以獲取SqlSession,SqlSession中包含了一系列操作數據庫的增刪查改的方法。
所以Mybatis的三個重要核心就是:SqlSessionFactoryBuilder 、SqlSessionFactory 、SqlSession
二、源碼解析
1、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 、SqlSessionFactory 、SqlSession這三個類都位于session包下,這是SqlSessionFactoryBuilder類結構圖
類中的9個build方法都是為了創建并返回SqlSessionFactory對象,根據參數類型,實際上可以分為三類方法
1.以Configuration對象為參數的創建
2.以InputStream對象為參數的創建
3.以Reader對象為參數的創建
但實際上最重要的是以Configuration對象的build方法,因為以InputStream、Reader對象為參數的build方法最后都是通過讀取xml配置文件,創建Configuration對象,并調用以Configuration對象為參數的build方法,最終返回DefaultSqlSessionFactory對象,以下是源碼
public SqlSessionFactory build(Reader reader, String environment, PRoperties properties) { SqlSessionFactory var5; try { XMLConfigBuilder e = new XMLConfigBuilder(reader, environment, properties); var5 = this.build((Configuration)e.parse()); } catch (Exception var14) { throw ExceptionFactory.wrapException("Error building SqlSession.", var14); } finally { ErrorContext.instance().reset(); try { reader.close(); } catch (IOException var13) { ; } } return var5;}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { SqlSessionFactory var5; try { XMLConfigBuilder e = new XMLConfigBuilder(inputStream, environment, properties); var5 = this.build((Configuration)e.parse()); } catch (Exception var14) { throw ExceptionFactory.wrapException("Error building SqlSession.", var14); } finally { ErrorContext.instance().reset(); try { inputStream.close(); } catch (IOException var13) { ; } } return var5;}
public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config);}
2、SqlSessionFactory
SqlSessionFactory是一個接口,其實真實干活的事它的實現類DefaultSqlSessionFactory,SqlSessionFactory顧名思義它是一個SqlSession的工廠類,其作用主要也是向外提供SqlSession,還有一個作用就是可以獲取Configuration對象
public interface SqlSessionFactory { SqlSession openSession(); SqlSession openSession(boolean var1); SqlSession openSession(Connection var1); SqlSession openSession(TransactionIsolationLevel var1); SqlSession openSession(ExecutorType var1); SqlSession openSession(ExecutorType var1, boolean var2); SqlSession openSession(ExecutorType var1, TransactionIsolationLevel var2); SqlSession openSession(ExecutorType var1, Connection var2); Configuration getConfiguration();}
提供8中獲取SqlSession的方法,涉及的參數主要有:自定義連接、事物隔離級別、ExecutorType(Statement類型【普通、預處理、批處理】)
這里需要注意的是openSession方法不是默認自動提交事物的。
3、SqlSession
SqlSession同樣是一個接口,實際干活的也是它的實現類DefaultSqlSession,這是它的類結構圖
從圖中我們可以看出,SqlSession的作用主要是提供數據庫的一些基本操作。
新聞熱點
疑難解答