一、前言
對(duì)于任何框架而言,在使用前都要進(jìn)行一系列的初始化,MyBatis也不例外。
二、MyBatis的初始化做了什么
2.1 Mybatis的初始化過程就是加載自己運(yùn)行時(shí)所需要的配置信息的過程
任何框架的初始化,無非是加載自己運(yùn)行時(shí)所需要的配置信息,Mybatis也是如此,Mybatis的初始化過程就是加載自己運(yùn)行時(shí)所需要的配置信息的過程。
Spring的初始化過程就是加載自己運(yùn)行時(shí)所需要的配置信息的過程,Mybatis的初始化過程就是加載自己運(yùn)行時(shí)所需要的配置信息的過程。
2.2 Mybatis的配置信息有哪些
MyBatis的配置信息,大概包含以下信息,其層級(jí)結(jié)構(gòu)如下:
× configuration 配置 × properties 屬性 × settings 設(shè)置 × typeAliases 類型命名 × typeHandlers 類型處理器 × objectFactory 對(duì)象工廠 × plugins 插件 × environments 環(huán)境 × environment 環(huán)境變量 × transactionManager 事務(wù)管理器 × dataSource 數(shù)據(jù)源 × 映射器
MyBatis的上述配置信息會(huì)配置在XML配置文件中,那么,這些信息被加載進(jìn)入MyBatis內(nèi)部,MyBatis是怎樣維護(hù)的呢?
2.3 mybatis-config.xml與Configuration類
MyBatis采用了一個(gè)非常直白和簡(jiǎn)單的方式:使用 org.apache.ibatis.session.Configuration 對(duì)象作為一個(gè)所有配置信息的容器,Configuration對(duì)象的組織結(jié)構(gòu)和XML配置文件的組織結(jié)構(gòu)幾乎完全一樣(當(dāng)然,Configuration對(duì)象的功能并不限于此,它還負(fù)責(zé)創(chuàng)建一些MyBatis內(nèi)部使用的對(duì)象,如Executor等)。如下圖所示:
MyBatis根據(jù)初始化好Configuration信息,這時(shí)候用戶就可以使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)操作了。可以這么說,MyBatis初始化的過程,就是創(chuàng)建 Configuration對(duì)象的過程。
2.4 MyBatis初始化的兩種方式
MyBatis的初始化可以有兩種方式(對(duì)應(yīng)Mybatis引導(dǎo)層:基于XML配置文件+基于Java API):
(1) 基于XML配置文件:基于XML配置文件的方式是將MyBatis的所有配置信息放在XML文件中,MyBatis通過加載并XML配置文件,將配置文信息組裝成內(nèi)部的Configuration對(duì)象。
(2) 基于Java API:這種方式不使用XML配置文件,需要MyBatis使用者在Java代碼中,手動(dòng)創(chuàng)建Configuration對(duì)象,然后手動(dòng)將配置參數(shù)set 進(jìn)入Configuration對(duì)象中。
接下來我們將通過 基于XML配置文件方式的MyBatis初始化,深入探討MyBatis是如何通過配置文件構(gòu)建Configuration對(duì)象,并使用它。
三、MyBatis基于XML配置文件創(chuàng)建Configuration對(duì)象的過程
3.1 定位到Mybatis初始化的關(guān)鍵一句
現(xiàn)在就從使用MyBatis的簡(jiǎn)單例子入手,深入分析一下MyBatis是怎樣完成初始化的,都初始化了什么。看以下代碼:
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 1、Mybatis初始化(根據(jù)InputStream得到SqlSessionFactory) SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 2、創(chuàng)建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 3、執(zhí)行SQL語句并返回結(jié)果 List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");
有過MyBatis使用經(jīng)驗(yàn)的讀者會(huì)知道,上述語句的作用是執(zhí)行com.foo.bean.BlogMapper.queryAllBlogInfo 定義的SQL語句,返回一個(gè)List結(jié)果集。總的來說,上述代碼經(jīng)歷了 “mybatis初始化 -->創(chuàng)建SqlSession -->執(zhí)行SQL語句并返回結(jié)果” 三個(gè)過程。
上述代碼的功能是根據(jù)配置文件 mybatis-config.xml 配置文件,創(chuàng)建SqlSessionFactory對(duì)象,然后產(chǎn)生SqlSession,執(zhí)行SQL語句。而mybatis的初始化就發(fā)生在第三句,就是這一句:
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
現(xiàn)在就讓我們看看第三句到底發(fā)生了什么。
3.2 MyBatis初始化基本過程
SqlSessionFactoryBuilder根據(jù)傳入的數(shù)據(jù)流(上面的inputStream)生成Configuration對(duì)象,然后根據(jù)Configuration對(duì)象創(chuàng)建默認(rèn)的SqlSessionFactory實(shí)例。
3.2.1 Mybatis初始化時(shí)序圖
初始化的基本過程如下序列圖所示:
該時(shí)序圖中涉及的類與接口:SqlSessionFactoryBuilder、XMLConfigBuilder、Configuration、XPathParser、XMLMapperEntityResolver
(1)SqlSessionFactoryBuilder :是一個(gè)一個(gè)非抽象類, SqlSessionFactory的構(gòu)造器,用于創(chuàng)建SqlSessionFactory,采用了Builder設(shè)計(jì)模式;
(2)XMLConfigBuilder:使用inputStream/reader得到XMLConfigBuilder類對(duì)象,引用名為parser,用來parse()得到Configuration對(duì)象。
上面時(shí)序圖對(duì)應(yīng)的解釋是:
// mybatis初始化第一步,調(diào)用build(),上圖中的1 build(inputStream) 調(diào)用 build(inputStream,null,null)
// mybatis初始化第二步,手動(dòng)創(chuàng)建XMLConfigBuilder,上圖中的2 XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, null,null);
// mybatis初始化第三步,parse()方法構(gòu)建configuration對(duì)象的過程,上圖中的 3 和 4 Configuration configuration=parser.parse();
// mybatis初始化第四步,使用Configuration對(duì)象創(chuàng)建SqlSessionFactory 上圖中 5 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
3.2.2 Mybatis初始化四步驟
由上圖所示,mybatis初始化要經(jīng)過簡(jiǎn)單的以下幾步:
- 最外層調(diào)用SqlSessionFactoryBuilder對(duì)象的build(inputStream)方法,此方法內(nèi)部明細(xì)就是下面的2、3、4;
- new XMLConfigBuilder()底層:SqlSessionFactoryBuilder會(huì)根據(jù)輸入流inputStream等信息創(chuàng)建XMLConfigBuilder對(duì)象;
- parse()底層parse()得到Configuration對(duì)象:SqlSessionFactoryBuilder調(diào)用XMLConfigBuilder對(duì)象的parse()方法,XMLConfigBuilder對(duì)象的parse()方法返回Configuration對(duì)象;
- bulid()底層Configuration對(duì)象得到DefaultSessionFactory對(duì)象:SqlSessionFactoryBuilder根據(jù)Configuration對(duì)象創(chuàng)建一個(gè)DefaultSessionFactory對(duì)象,它是SqlSessionFactory接口的實(shí)現(xiàn)類,所有build()返回的返回類型為SqlSessionFactory;SqlSessionFactoryBuilder返回 DefaultSessionFactory對(duì)象給Client,供Client使用。
3.2.3 Mybatis初始化四步驟代碼解析
SqlSessionFactoryBuilder相關(guān)的代碼如下所示:
SqlSessionFactoryBuilder.java public SqlSessionFactory build(InputStream inputStream) { //1. 調(diào)用SqlSessionFactoryBuilder對(duì)象的build(inputStream)方法 return build(inputStream, null, null); } public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { try { //2. 創(chuàng)建XMLConfigBuilder對(duì)象用來解析XML配置文件,生成Configuration對(duì)象 XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); //3. 將XML配置文件內(nèi)的信息解析成Java對(duì)象Configuration對(duì)象 Configuration config = parser.parse(); //4. 根據(jù)Configuration對(duì)象創(chuàng)建出SqlSessionFactory對(duì)象 return build(config); } catch (Exception e) { throw ExceptionFactory.wrapException("Error building SqlSession.", e); } finally { ErrorContext.instance().reset(); try { inputStream.close(); } catch (IOException e) { // Intentionally ignore. Prefer previous error. } } } //從此處可以看出,MyBatis內(nèi)部通過Configuration對(duì)象來創(chuàng)建SqlSessionFactory,用戶也可以自己通過API構(gòu)造好Configuration對(duì)象,調(diào)用此方法創(chuàng)建SqlSessionFactory public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config); }
3.2.4 Mybatis初始化涉及的接口與類
上述的初始化過程中,涉及到了以下幾個(gè)對(duì)象:
(1)SqlSessionFactoryBuilder :是一個(gè)一個(gè)非抽象類, SqlSessionFactory的構(gòu)造器,用于創(chuàng)建SqlSessionFactory,采用了Builder設(shè)計(jì)模式
(2)XMLConfigBuilder:負(fù)責(zé)將mybatis-config.xml配置文件解析成Configuration對(duì)象,供SqlSessonFactoryBuilder使用,創(chuàng)建SqlSessionFactory
(3)Configuration :是一個(gè)非抽象類,可以實(shí)例化對(duì)象,該對(duì)象是mybatis-config.xml文件中所有mybatis配置信息
(4)SqlSessionFactory:SqlSession工廠類,是一個(gè)接口,實(shí)現(xiàn)類是DefaultSqlSessionFactory,以工廠形式創(chuàng)建SqlSession對(duì)象,采用了Factory工廠設(shè)計(jì)模式
3.3 parse()內(nèi)部創(chuàng)建Configuration對(duì)象的過程
問題:在MyBatis初始化基本過程中,當(dāng)SqlSessionFactoryBuilder執(zhí)行build()方法,調(diào)用了XMLConfigBuilder的parse()方法,然后返回了Configuration對(duì)象。那么parse()方法是如何處理XML文件,生成Configuration對(duì)象的呢?
回答:四個(gè)步驟,如下:
第一步,從XMLConfigBuilder到XPathParser
第二步,解析configuration節(jié)點(diǎn)
第三步,解析出來的值設(shè)置到Configuration對(duì)象中
第四步,返回Configuration對(duì)象
3.3.1 從XMLConfigBuilder到XPathParser
XMLConfigBuilder類會(huì)將XML配置文件的信息轉(zhuǎn)換為Document對(duì)象,而XML配置定義文件DTD轉(zhuǎn)換成XMLMapperEntityResolver對(duì)象,然后將二者(Document對(duì)象和XMLMapperEntityResolver對(duì)象)封裝到XpathParser對(duì)象中,XpathParser的作用是提供根據(jù)Xpath表達(dá)式獲取基本的DOM節(jié)點(diǎn)Node信息的操作。如下圖所示:
XML配置文件(mybatis-config.xml + XxxMapper.xml)的信息轉(zhuǎn)換為Document對(duì)象,而XML配置定義文件DTD(mybatis-3-config.dtd + mybatis-3-mapper.dtd 這里的3表示mybatis的版本)轉(zhuǎn)換成XMLMapperEntityResolver對(duì)象,然后將二者封裝到XpathParser對(duì)象中。
XpathParser的作用是提供根據(jù)Xpath表達(dá)式獲取基本的DOM節(jié)點(diǎn)Node信息的操作,如下所示:
3.3.2 解析configuration節(jié)點(diǎn)
XMLConfigBuilder調(diào)用parse()方法:會(huì)從XPathParser中取出 <configuration>
節(jié)點(diǎn)對(duì)應(yīng)的Node對(duì)象,然后解析此Node節(jié)點(diǎn)的子Node:properties, settings, typeAliases,typeHandlers, objectFactory, objectWrapperFactory, plugins, environments,databaseIdProvider, mappers,一個(gè)10個(gè),代碼如下:
public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; //源碼中沒有這一句,只有 parseConfiguration(parser.evalNode("/configuration")); //為了讓讀者看得更明晰,源碼拆分為以下兩句 XNode configurationNode = parser.evalNode("/configuration"); parseConfiguration(configurationNode); return configuration; } /* 解析 "/configuration"節(jié)點(diǎn)下的子節(jié)點(diǎn)信息,然后將解析的結(jié)果設(shè)置到Configuration對(duì)象中 */ private void parseConfiguration(XNode root) { try { //1.首先處理properties 節(jié)點(diǎn) propertiesElement(root.evalNode("properties")); //issue #117 read properties first //2.處理typeAliases typeAliasesElement(root.evalNode("typeAliases")); //3.處理插件 pluginElement(root.evalNode("plugins")); //4.處理objectFactory objectFactoryElement(root.evalNode("objectFactory")); //5.objectWrapperFactory objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); //6.settings settingsElement(root.evalNode("settings")); //7.處理environments environmentsElement(root.evalNode("environments")); // read it after objectFactory and objectWrapperFactory issue #631 //8.database databaseIdProviderElement(root.evalNode("databaseIdProvider")); //9. typeHandlers typeHandlerElement(root.evalNode("typeHandlers")); //10 mappers mapperElement(root.evalNode("mappers")); } catch (Exception e) { throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e); } }
注意:在上述代碼中,還有一個(gè)非常重要的地方,就是解析XML配置文件子節(jié)點(diǎn)<mappers>
的方法mapperElements(root.evalNode("mappers"))
, 它將解析我們配置的Mapper.xml配置文件,Mapper配置文件可以說是MyBatis的核心,MyBatis的特性和理念都體現(xiàn)在此Mapper的配置和設(shè)計(jì)上。
3.3.3 解析出來的值設(shè)置到Configuration對(duì)象中
解析子節(jié)點(diǎn)的過程這里就不一一介紹了,用戶可以參照MyBatis源碼仔細(xì)揣摩,我們就看上述的environmentsElement(root.evalNode("environments"));
方法是如何將environments的信息解析出來,設(shè)置到Configuration對(duì)象中的:
/* 解析environments節(jié)點(diǎn),并將結(jié)果設(shè)置到Configuration對(duì)象中 注意:創(chuàng)建envronment時(shí),如果SqlSessionFactoryBuilder指定了特定的環(huán)境(即數(shù)據(jù)源); 則返回指定環(huán)境(數(shù)據(jù)源)的Environment對(duì)象,否則返回默認(rèn)的Environment對(duì)象; 這種方式實(shí)現(xiàn)了MyBatis可以連接多數(shù)據(jù)源 */ private void environmentsElement(XNode context) throws Exception { if (context != null) { if (environment == null) { environment = context.getStringAttribute("default"); } for (XNode child : context.getChildren()) { String id = child.getStringAttribute("id"); if (isSpecifiedEnvironment(id)) { //1.創(chuàng)建事務(wù)工廠 TransactionFactory,繼續(xù)深入子節(jié)點(diǎn) TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager")); DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource")); //2.創(chuàng)建數(shù)據(jù)源DataSource DataSource dataSource = dsFactory.getDataSource(); //3. 構(gòu)造Environment對(duì)象 Environment.Builder environmentBuilder = new Environment.Builder(id) .transactionFactory(txFactory) .dataSource(dataSource); //4. 將創(chuàng)建的Envronment對(duì)象設(shè)置到configuration 對(duì)象中 configuration.setEnvironment(environmentBuilder.build()); } } } } private boolean isSpecifiedEnvironment(String id) { if (environment == null) { throw new BuilderException("No environment specified."); } else if (id == null) { throw new BuilderException("Environment requires an id attribute."); } else if (environment.equals(id)) { return true; } return false; }
3.3.4 返回Configuration對(duì)象
public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; //源碼中沒有這一句,只有 parseConfiguration(parser.evalNode("/configuration")); //為了讓讀者看得更明晰,源碼拆分為以下兩句 XNode configurationNode = parser.evalNode("/configuration"); parseConfiguration(configurationNode); return configuration; // 完成后,返回configuration對(duì)象,返回給程序員 }
3.4 MyBatis初始化基本過程的序列圖細(xì)化
3.4.1 MyBatis初始化基本過程的序列圖組件
我們將上述的MyBatis初始化基本過程的序列圖細(xì)化,這里包含了parse()方法將 mybatis-config.xml 解析成 Configuration對(duì)象的過程,如下圖:
該時(shí)序圖中涉及的類與接口:SqlSessionFactoryBuilder、XMLConfigBuilder、Configuration、XPathParser、XMLMapperEntityResolver
(1) SqlSessionFactoryBuilder :是一個(gè)一個(gè)非抽象類, SqlSessionFactory的構(gòu)造器,用于創(chuàng)建SqlSessionFactory,采用了Builder設(shè)計(jì)模式
(2) XMLConfigBuilder:使用inputStream/reader得到XMLConfigBuilder的類對(duì)象,引用名為parser,用來parse()得到Configuration對(duì)象,負(fù)責(zé)將mybatis-config.xml配置文件解析成Configuration對(duì)象,供SqlSessonFactoryBuilder使用,創(chuàng)建SqlSessionFactory
(3) Configuration :是一個(gè)非抽象類,可以實(shí)例化對(duì)象,該對(duì)象是mybatis-config.xml文件中所有mybatis配置信息
(4) SqlSessionFactory:SqlSession工廠類,是一個(gè)接口,實(shí)現(xiàn)類是DefaultSqlSessionFactory,以工廠形式創(chuàng)建SqlSession對(duì)象,采用了Factory工廠設(shè)計(jì)模式
(5) Document:由XML配置文件的信息轉(zhuǎn)換而來,最后被封裝到XpathParser對(duì)象中。
(6) XMLMapperEntityResolver:由XML配置定義文件DTD轉(zhuǎn)換而來,最后被封裝到XpathParser對(duì)象中。
(7) XPathParser:XMLConfigBuilder會(huì)將XML配置文件的信息轉(zhuǎn)換為Document對(duì)象,而XML配置定義文件DTD轉(zhuǎn)換成XMLMapperEntityResolver對(duì)象,然后將二者封裝到XpathParser對(duì)象。
parse()方法第一步:XMLConfigBuilder會(huì)將XML配置文件的信息轉(zhuǎn)換為Document對(duì)象,而XML配置定義文件DTD轉(zhuǎn)換成XMLMapperEntityResolver對(duì)象,然后將二者封裝到XpathParser對(duì)象中,XpathParser的作用是提供根據(jù)Xpath表達(dá)式獲取基本的DOM節(jié)點(diǎn)Node信息的操作
3.4.2 MyBatis初始化基本過程的序列圖流程
MyBatis初始化基本過程的序列圖對(duì)應(yīng)的解釋是:
mybatis初始化第一步,調(diào)用build(),就是第二步、第三步、第四步的總稱
mybatis初始化第二步,手動(dòng)創(chuàng)建XMLConfigBuilder
上圖中的 1 XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, null,null);
2.1 2.2 只是新建一個(gè)XMLMapperEntityResolver對(duì)象;
3.1 3.2 新建一個(gè)XPathParser對(duì)象;
4.1 4.2 新建一個(gè)Configuration對(duì)象;
mybatis初始化第三步,parse()方法構(gòu)建configuration對(duì)象的過程
mybatis初始化第三步就是上圖中 5 到 11 的解釋,
5 是調(diào)用parse()方法
6.1、7.1、7.2、6.2 就是解析mybatis-config.xml中的configuration節(jié)點(diǎn)
然后子configuration節(jié)點(diǎn)中的子節(jié)點(diǎn)的循環(huán),8.1 8.2 是解析子節(jié)點(diǎn),9 是獲取相應(yīng)的值,10是設(shè)置值到configuration對(duì)象中
11 是返回configuration對(duì)象 Configuration configuration=parse();
parse()第一步:從XMLConfigBuilder到XPathParser
parse()第二步:解析configuration節(jié)點(diǎn)
parse()第三步:解析出來的值設(shè)置到Configuration對(duì)象中
parse()第四步:返回configuration對(duì)象
mybatis初始化第四步,得到了Configuration對(duì)象之后,使用Configuration對(duì)象創(chuàng)建SqlSessionFactory,即圖中的
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
注意:上圖中,4.1和4.2只是返回一個(gè)空的configuration對(duì)象,5―11才是返回一個(gè)構(gòu)造好的configuration類對(duì)象,是不一樣的。
3.5 手動(dòng)加載XML配置文件創(chuàng)建Configuration對(duì)象完成初始化
我們可以使用XMLConfigBuilder手動(dòng)解析XML配置文件來創(chuàng)建Configuration對(duì)象,創(chuàng)建并使用SqlSessionFactory對(duì)象,代碼如下:
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //手動(dòng)創(chuàng)建XMLConfigBuilder,并解析創(chuàng)建Configuration對(duì)象 XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, null,null); Configuration configuration=parse(); //使用Configuration對(duì)象創(chuàng)建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); //使用MyBatis SqlSession sqlSession = sqlSessionFactory.openSession(); List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");
四、Mybatis初始化中涉及到的設(shè)計(jì)模式
初始化的過程涉及到創(chuàng)建各種對(duì)象,所以會(huì)使用一些創(chuàng)建型的設(shè)計(jì)模式。在初始化的過程中,Builder模式運(yùn)用的比較多,至少涉及到兩個(gè)Builder模式的使用:SqlSessionFactory的創(chuàng)建、數(shù)據(jù)庫(kù)連接環(huán)境Environment對(duì)象的創(chuàng)建。
4.1 SqlSessionFactory的創(chuàng)建
對(duì)于創(chuàng)建SqlSessionFactory時(shí),會(huì)根據(jù)情況提供不同的參數(shù),其參數(shù)組合可以有以下幾種:
由于構(gòu)造時(shí)參數(shù)不定,可以為其創(chuàng)建一個(gè)構(gòu)造器Builder,將SqlSessionFactory的構(gòu)建過程和表示分開:
MyBatis將SqlSessionFactoryBuilder和SqlSessionFactory相互獨(dú)立,先通過 builder() 方法得到一個(gè)SqlSessionFactoryBuilder 對(duì)象,然后再通過 SqlSessionFactoryBuilder 對(duì)象構(gòu)建一個(gè) SqlSessionFactory 對(duì)象,體現(xiàn)了構(gòu)造器模式的應(yīng)用。
4.2 數(shù)據(jù)庫(kù)連接環(huán)境Environment對(duì)象的創(chuàng)建
在構(gòu)建Configuration對(duì)象的過程中,XMLConfigParser解析 mybatis XML配置文件節(jié)點(diǎn) <environment>
節(jié)點(diǎn)時(shí),會(huì)有以下相應(yīng)的代碼:
private void environmentsElement(XNode context) throws Exception { if (context != null) { if (environment == null) { environment = context.getStringAttribute("default"); } for (XNode child : context.getChildren()) { String id = child.getStringAttribute("id"); //是和默認(rèn)的環(huán)境相同時(shí),解析之 if (isSpecifiedEnvironment(id)) { TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager")); DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource")); DataSource dataSource = dsFactory.getDataSource(); //使用了Environment內(nèi)置的構(gòu)造器Builder,傳遞id 事務(wù)工廠和數(shù)據(jù)源 Environment.Builder environmentBuilder = new Environment.Builder(id) .transactionFactory(txFactory) .dataSource(dataSource); configuration.setEnvironment(environmentBuilder.build()); } } } }
在Environment內(nèi)部,定義了靜態(tài)內(nèi)部Builder類:
public final class Environment { private final String id; private final TransactionFactory transactionFactory; private final DataSource dataSource; public Environment(String id, TransactionFactory transactionFactory, DataSource dataSource) { if (id == null) { throw new IllegalArgumentException("Parameter 'id' must not be null"); } if (transactionFactory == null) { throw new IllegalArgumentException("Parameter 'transactionFactory' must not be null"); } this.id = id; if (dataSource == null) { throw new IllegalArgumentException("Parameter 'dataSource' must not be null"); } this.transactionFactory = transactionFactory; this.dataSource = dataSource; } public static class Builder { private String id; private TransactionFactory transactionFactory; private DataSource dataSource; public Builder(String id) { this.id = id; } public Builder transactionFactory(TransactionFactory transactionFactory) { this.transactionFactory = transactionFactory; return this; } public Builder dataSource(DataSource dataSource) { this.dataSource = dataSource; return this; } public String id() { return this.id; } public Environment build() { return new Environment(this.id, this.transactionFactory, this.dataSource); } } public String getId() { return this.id; } public TransactionFactory getTransactionFactory() { return this.transactionFactory; } public DataSource getDataSource() { return this.dataSource; } }
五、尾聲
《利刃出鞘,Mybatis初始化》,完成了。
天天打碼,天天進(jìn)步!!!
到此這篇關(guān)于Mybatis初始化知識(shí)小結(jié)的文章就介紹到這了,更多相關(guān)Mybatis初始化內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/qq_36963950/article/details/120644706