MyBatis學習(二):解析MyBatis配置文件的寫法和使用原理

MyBatis學習(一):一個簡單的演示

上面就是一個很簡單的MyBatis的應用實例,可以看看,對於如何如此做可能就不是很清楚了。

首先每一個MyBatis的應用程序都是以一個SqlSessionFactory對象的實例爲核心。SqlSessionFactory對象的實例可以通過SqlSessionFactoryBuilder對象來獲得。SqlSessionFactoryBuilder對象可以從XML配置文件或是從configuration類的準備的實例中構建相應的SqlSessionFactory對象。下面是通過XML配置文件來構建SqlSessionFactory對象。由於conf.xml是直接放在src下,因此文件路徑可以省,但是如果xml文件是放在包下面還要把包名稱寫上。

		String resource="conf.xml";
		InputStream inputStream=Resources.getResourceAsStream(resource);
		SqlSessionFactory sessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />

			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis002" />
				<property name="username" value="root" />
				<property name="password" value="wang314159" />
			</dataSource>

		</environment>
	</environments>
	<mappers >
		<mapper resource="User.xml"/>
	</mappers>

</configuration>


SqlSessionFactoryBuilder:

這個類可以被實例化,使用和丟棄。一旦你創建了 SqlSessionFactory 後,這個類就不需要存在了。因此 SqlSessionFactoryBuilder 實例的最佳範圍是方法範圍(也就是本地方法變量)。
你可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例,但是最好的方式是
不需要保持它一直存在來保證所有 XML 解析資源,因爲還有更重要的事情要做。

SqlSessionFactory:

一旦被創建,SqlSessionFactory 應該在你的應用執行期間都存在。沒有理由來處理或重
新創建它。使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重複創建多次。這樣的
操作將被視爲是非常糟糕的。因此 SqlSessionFactory 的最佳範圍是應用範圍。有很多方法可
以做到,最簡單的就是使用單例模式或者靜態單例模式。然而這兩種方法都不認爲是最佳實
踐。這樣的話,你可以考慮依賴注入容器,比如 Google Guice 或 Spring。這樣的框架允許你
創建支持程序來管理單例 SqlSessionFactory 的生命週期。

SqlSession:

每個線程都應該有它自己的 SqlSession 實例。SqlSession 的實例不能被共享,也是線程
不安全的。因此最佳的範圍是請求或方法範圍。絕對不能將 SqlSession 實例的引用放在一個
類的靜態字段甚至是實例字段中。也絕不能將 SqlSession 實例的引用放在任何類型的管理範
圍中,比如 Serlvet 架構中的 HttpSession。如果你現在正用任意的 Web 框架,要考慮 SqlSession
放在一個和 HTTP 請求對象相似的範圍內。換句話說,基於收到的 HTTP 請求,你可以打開
了一個 SqlSession,然後返回響應,就可以關閉它了。關閉 Session 很重要,你應該確保使
用 finally 塊來關閉它。


XML配置文件包含對於MyBatis系統的核心設置,包含獲取數據庫連接實例的數據源和決定事務範圍和控制的事務管理器。environment元素體中包含對事務管理和連接池的環境配置。mappers元素是包含所有mapper(映射器)的列表,這些mapper的xml文件包含SQL代碼和映射定義信息。

對於使用mybatis中,需要兩個xml文件,一個是xml配置文件,另外一個是SQl映射文件。首先是xml配置文件。他的高層架構如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<properties>
	</properties>

	<settings>
		<setting name="" value="" />
	</settings>

	<typeAliases>
	</typeAliases>

	<typeHandlers>
	</typeHandlers>

	<objectFactory type="">
	</objectFactory>

	<plugins>
		<plugin interceptor=""></plugin>
	</plugins>

	<environments default="">
		<environment id="">
			<transactionManager type="">
			</transactionManager>
			<dataSource type="">
				<property name="" value="" />
			</dataSource>
		</environment>
	</environments>

	<mappers>
		<mapper resource="" />
	</mappers>

</configuration>

上面是所有的結構,但在使用過程中可能不會全部使用。

1.properties

其實這個使用的很多,我們經常會將連接數據庫的信息,放在一個配置文件中,這樣就可以使用這個來加載配置文件。有一個db.properties文件中的內容如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis001
username=root
password=wang314159

conf.xml中需要使用properties加載這個配置文件:

<properties resource="db.properties">
</properties>

當然在properties中也可以添加<property />

<properties resource="db.properties">
		<property name="name" value="root" />
		<property name="password" value="wang123456" />
	</properties>

後面的property如果與db.properties中相同名字,那麼將會覆蓋db.properties中的。

在下面<dataSource/>中使用就可以直接通過${}獲取,如下所示,這樣在更改連接的時候就會很方便,當然也起到一定的隱藏。

2.setting

這個一個很需要注意的,裏面的配置會改變MyBatis的行爲方式,下面的表格描述了設置信息,含義和默認值。



3.typeAliases

類型別名是爲java類型命名一個短的名字,這個設置後,在sql映射的xml文件中很有使用的價值,他只是用來減少類完全限定名的多餘部分。其實簡單的說就是給需要的起一個別名,在sql映射文件中,需要使用到java bean,類完全限定名可能要包括包名會很長,使用起來不是很方便

<typeAliases>
		<typeAlias type="com.wpl.demo.User" alias="_User" />
</typeAliases>

上面設置,需要使用com.wpl.demo.User這個類完全限定名時候就可以使用_User來代替,這個使用起來很方便,用的也比較多。

4.typeHandlers

無論是MyBatis在預處理語句中設置一個參數,還是從結果集中取出一個值時候,類型處理器被用來將獲取的值以合適的方式轉化爲java類型。下面的表格描述了默認類型的處理器。

 

當然我們也可以自己根據自己需要重寫類型處理器或創建自己的類型處理器來處理不支持的或非標準的類型。這時候需要實現TypeHandler接口(org.mybatis.tye),然後映射新的類型處理器到java類型,還有可選的一個JDBC類型。但是很多情況下,我們不會自己做,因此默認已經做的很好了。

 

5.objectFactory

MyBatis每次創建結果對象新的實例時候,它使用一個ObjectFactory實例來完成。如果參數映射存在,默認的ObjectFactory不比使用默認構造方法或是帶參數的構造方法實例化目標類做的工作多。如果你想重寫默認的ObjectFactory,你可以創建你自己的。

 

6.plugins

MyBatis允許你在某一點攔截已映射語句執行的調用。在默認情況下,MyBatis允許使用插件來攔截方法調用。

這個用到的很少,如果你確實有使用到相關的操作,可以自己更加深入的學習。

7.environments

MyBatis可以配置多種環境。這會幫助你將SQL映射應用到多種數據庫之中。例如,你也許爲開發設置不同的配置,測試和生產環境。或者你可能有多種生產數據庫但是共享相同的模式,所以你會想對不同數據庫使用相同的SQL映射。

一個很重要的問題需要記住:你可以配置多種環境,但是你只能爲每個SqlSessionFactory實例選擇一個。所以如果你想連接兩個數據庫,那麼你需要創建兩個SqlSessionFactory實例,每一個數據庫對應一個。如果是三個數據庫,你需要三個實例,以此類推。

每一個數據庫對應一個SqlSessionFactory,爲了明確創建哪種環境,你可以選擇將他作爲參數傳遞給SqlSessionFactoryBuilder

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory  factory  =  sqlSessionFactoryBuilder.build(reader,
environment,properties);

如果環境被忽略,沒那麼環境將會被加載,如下運行

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);

8.transactionManager

mybatis中有兩個事務管理器類型(type=[JDBC|MANAGED]

(1).JDBC:這個配置直接簡單使用了JDBC的提交和回滾設置。它依賴於從數據源得到連接來管理事務範圍。

(2).MANAGED:這個配置幾乎沒有做什麼。他從來不提交或是回滾一個連接。而他會讓容器來管理事務的整個週期。默認情況下他會關閉連接。然而一些容器並不希望這樣,因此如果你需要從連接中停止他,將closeConnection屬性設置爲false

<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>

9.dataSource

dataSource 元素使用基本的 JDBC 數據源接口來配置 JDBC 連接對象的資源。

Ø  許多 MyBatis 的應用程序將會按示例中的例子來配置數據源。然而它並不是必須的。

要知道爲了方便使用延遲加載,數據源纔是必須的。

有三種內建的數據源類型(也就是 type=???”):

(1)UNPOOLED – 這個數據源的實現是每次被請求時簡單打開和關閉連接。它有一點慢,

這是對簡單應用程序的一個很好的選擇,因爲它不需要及時的可用連接。不同的數據庫對這

個的表現也是不一樣的,所以對某些數據庫來說配置數據源並不重要,這個配置也是閒置的。

UNPOOLED 類型的數據源僅僅用來配置以下 4 種屬性:

 driver – 這是 JDBC 驅動的 Java 類的完全限定名(如果你的驅動包含,它也不是

數據源類)。

 url – 這是數據庫的 JDBC URL 地址。

 username – 登錄數據庫的用戶名。

    password – 登錄數據庫的密碼。

 defaultTransactionIsolationLevel – 默認的連接事務隔離級別。

作爲可選項,你可以傳遞數據庫驅動的屬性。要這樣做,屬性的前綴是以driver.”開

頭的,例如:

 driver.encoding=UTF8

UTF8 ” 來 傳 遞 屬 性 “ encoding ”, 它 是 通 過

DriverManager.getConnection(url,driverProperties)方法傳遞給數據庫驅動。

(2)POOLED – 這是 JDBC 連接對象的數據源連接池的實現,用來避免創建新的連接實例

時必要的初始連接和認證時間。這是一種當前 Web 應用程序用來快速響應請求很流行的方

法。

除了上述(UNPOOLED)的屬性之外,還有很多屬性可以用來配置 POOLED 數據源:

 poolMaximumActiveConnections – 在任意時間存在的活動(也就是正在使用)連

接的數量。默認值:10

 poolMaximumIdleConnections – 任意時間存在的空閒連接數。

  poolMaximumCheckoutTime – 在被強制返回之前,池中連接被檢查的時間。默認

值:20000 毫秒(也就是 20 秒)

 poolTimeToWait – 這是給連接池一個打印日誌狀態機會的低層次設置,還有重新

嘗試獲得連接,這些情況下往往需要很長時間(爲了避免連接池沒有配置時靜默失

敗)。默認值:20000 毫秒(也就是 20 秒)

 poolPingQuery – 發送到數據的偵測查詢,用來驗證連接是否正常工作,並且準備

接受請求。默認是NO PING QUERY SET”,這會引起許多數據庫驅動連接由一

個錯誤信息而導致失敗。

  poolPingEnabled – 這是開啓或禁用偵測查詢。如果開啓,你必須用一個合法的

SQL 語句(最好是很快速的)設置 poolPingQuery 屬性。默認值:false

 poolPingConnectionsNotUsedFor – 這是用來配置 poolPingQuery 多次時間被用一

次。這可以被設置匹配標準的數據庫連接超時時間,來避免不必要的偵測。默認值:

0(也就是所有連接每一時刻都被偵測-但僅僅當 poolPingEnabled true 時適用)。

(3)JNDI – 這個數據源的實現是爲了使用如 Spring 或應用服務器這類的容器,容器可以集

中或在外部配置數據源,然後放置一個 JNDI 上下文的引用。這個數據源配置只需要兩個屬

性:

 initial_context – 這 個 屬 性 用 來 從 初 始 上 下 文 中 尋 找 環 境 ( 也 就 是

initialContext.lookupinitial——context))。這是個可選屬性,如果被忽略,那麼

data_source 屬性將會直接以 initialContext 爲背景再次尋找。

 data_source – 這是引用數據源實例位置的上下文的路徑。它會以由 initial_context

查詢返回的環境爲背景來查找,如果 initial_context 沒有返回結果時,直接以初始

上下文爲環境來查找。

和其他數據源配置相似,它也可以通過名爲env.”的前綴直接向初始上下文發送屬性。

比如:

 env.encoding=UTF8

在初始化之後,這就會以值UTF8”向初始上下文的構造方法傳遞名爲“encoding

的屬性。

10.mapper

這個就是SQl映射文件在這裏加載。






發佈了54 篇原創文章 · 獲贊 70 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章