初次學習mybatis的時候,配置文件的節點挺多的,都不知道什麼意思,能不能換其餘的屬性值,他們的優勢在哪兒?他們在什麼狀況下使用?它們各自的區別?帶着這些個問題因而我就寫了這篇博客。有什麼不對或錯誤的地方,請你們竭盡全力的指正,謝謝。java
1.在ibatis的配置文件中dataSource節點有這麼個配置<datasource type=」SIMPlE」></datasource>,根據原文下的解釋知道其中type有SIMPLE、DBCP、JNDI三種。我想問下這三種類型的區別在於哪裏,在什麼狀況下用到,經常使用的是哪一個,及它們各自的優勢。mysql
看狀況,simple用於測試,dbcp是採用dbcp作數據源,jndi是使用app server提供的數據源。通常來講,在實際應用中jndi用的比較多,simple用於測試。不過,多說一句,datasource通常都是在spring中集成或管理,因此和spring集成時,不多使用ibatis的dataSource節點。web
JDBC:使用數據庫本身的事務(局部事務),connect.beginTranstion(),connect.commit()等spring
JTA:使用jta事務管理器管理事務(全局事務),使用userTranstion對象。sql
External:本身(Ibatis)不控制事務,事物都是spring託管的,若是不是,那就用JDBC,若是在app server中,你又不想使用容器託管事務,那就用JTA。數據庫
基本上用處不大(可能會有不少人和個人觀點不一樣)緩存
Ibatis是sql拼裝器,強調的是直接與數據庫打交道,sql的質量決定了最好的效率,再說數據庫自己提供的cache。類型many to one,many to many,one to one的hibernate的產物,能夠直接作成視圖,在使用ibatis去查詢,這樣能夠充分的使用db本身的cache服務器
</ dataSource >mybatis
</ transactionManager >app
< sqlMap resource ="com/wyq/map/userMap.xml" />
</ sqlMapConfig >
JNDI的配置大部分都在應用服務器中進行,因此在ibatis中的配置相對簡單
(1)JDBC事務控制的JNDI配置
< transctionManager type ="JDBC" >
< dataSource type ="JNDI" >
< property name ="DataSource" value ="java:comp/env/jdbc/myDataSource" />
</ dataSource >
</ transctionManager >
(2)JTA事務控制的JNDI配置
< transctionManager type ="JTA" >
< property name ="UserTransaction" value ="java:/ctx/con/UserTransaction" />
< dataSource type ="JNDI" >
< property name ="DataSource" value ="java:comp/env/jdbc/myDataSource" />
</ dataSource >
</ transctionManager >
*許多MyBatis的應用程序將會按示列中的例子來配置數據源。然而它並非必須的。要知道爲了方便使用延遲加載,數據源纔是必須的。
2.1UNPOOLED-這個數據源的實現是每次被請求時簡單打開和關閉鏈接。它有一點慢,這是對簡單應用程序的一個很好的選擇,由於他不須要及時的可用鏈接。不一樣的數據庫對這個的表現也是不同的,因此對某些數據庫來上配置數據源並不重要,這個配置也是閒置的。UNPOOLED類型的數據源僅僅用來配置一下五種屬性:
2.1.1*driver-這是JDBC驅動的java類的徹底限定名(若是你的驅動包包含,他也不是數據源類)
2.1.2*url-這是數據庫的JDBC URL地址
2.1.3*username-登陸數據庫的用戶名
2.1.4*password-登陸數據庫的密碼
2.1.5*defaultTransactionIsolationLevel-默認的鏈接事務隔離級別
*做爲可選項,你能夠傳遞數據庫驅動的屬性。要這樣作,屬性的前綴是以」driver.」開頭的,列如:
*driver.encoding=UTF-8
這樣就會傳遞以值」UTF-8」來傳遞屬性」encoding」,它是經過DriverManager.getConnection(url,driverProperties)方法傳遞給數據庫驅動。
2.2POOLED-這是JDBC鏈接對象的數據源鏈接池的實現,用來避免建立新的鏈接實例時必要的初始鏈接和認證時間。這是一種當前web應用程序用來快速響應請求很流行的方法。
除了上述(UNPOOLED)的屬性以外,還有不少屬性能夠用來配置POOLED數據源:
2.2.1*poolMaximumActiveConnections-在任意時間存在的活動(也就是正在使用)鏈接的數量。默認值:10
2.2.2*poolMaximumIdleConnections-任意時間存在的空閒鏈接數
2.2.3*poolMaximumCheckoutTime-在被強制返回以前,池中鏈接被檢查的時間。默認值:20000毫秒(也就是20秒)
2.2.4*poolTimeToWait-這是給鏈接池一個打印日誌狀態機會的低層次設置,還有從新嘗試得到鏈接,這些狀況下每每須要很長時間。(爲了不鏈接池沒有配置時靜默失敗)。默認值:20000毫秒(也就是20秒)
2.2.5*poolPingQuery-發送到數據的偵測查詢,用來驗證鏈接是否正常工做,而且準備接收請求。默認是」NO PING NO QUERY SET」,這會引起許多數據庫驅動鏈接有一個錯誤信息而致使失敗。
2.2.6*poolPingEnabled-這是開啓或禁止偵測查詢。若是開啓,你必須用一個合法的SQL語句(最好是很快速的)設置poolPingQuery屬性。默認值:false。
2.2.7*poolPingConnectionsNotUsedFor-這是用來配置poolPingQuery屢次時間被用一次。這能夠被設置匹配標準的數據庫鏈接超時時間,來避免沒必要要的偵測。默認值:0(也就是全部鏈接每一時刻都被偵測-但僅僅當poolPingEnabled爲true時適用)。
2.3JNDI-這個數據源的實現是爲了使用如Spring或這類的容器,容器能夠集中或在外部配置數據源,而後放置一個JNDI上下文的引用。這個數據源配置只須要兩個屬性:
2.3.1*initial_context-這個屬性用來從初始上下文中尋找環境(也就是initial Context.lookup(initial--context)。這是個可選屬性,若是被忽略,那麼data_source屬性將會直接以initialCotext爲背景再次尋找)。
2.3.2*data_source-這是引用數據源實例位置的上下文的路徑。它會以由initial_context查詢返回的環境爲背景來查找,若是initial_Context沒有返回結果時,直接初始上下文環境來查找。
和其餘數據源配置類似,他也能夠經過名爲」env.」的前綴直接向上下文發送屬性。好比:
*env.encoding=UTF-8
在初始化以後,這就會以值」UTF-8」向初始上下文的構造方法傳遞名」encoding」的屬性。
3.1configuration有什麼做用?
configuration管理MyBatis的配置,MyBatis的全部配置信息都存放的在configuration中。
下面咱們看看configuration可配置的屬性有哪些:
3.1.1*properties屬性
實例:
1 <properties resource="org/mybatis/example/config.properties"> 2 <property name="username" value="dev_user"/> 3 <property name="password" value="F2Fa3!33TYyg"/> 4 </properties>
這些都是外部化的,可替代的屬性。其中的屬性就能夠再整個配置文件中使用,使用可替換的屬性來實現動態配置,以下
1 <dataSource type="POOLED"> 2 <property name="driver" value="${driver}"/> 3 <property name="url" value="${url}"/> 4 <property name="username" value="${username}"/> 5 <property name="password" value="${password}"/> 6 </dataSource>
若是這些地方屬性多餘一個,沒MyBatis按照下面的順序加載:
在properties元素體內指定的屬性首先被讀取。
從類路徑下資源或者properties元素的eurl屬性中加載的屬性第二被讀取,它會覆蓋已經存在的徹底同樣的屬性。
做爲方法參數船傳遞的屬性最後被讀取,他會覆蓋任一已存在的徹底同樣的屬性。
3.1.2 *setings
這些是很是重要的屬性,他會修改MyBatis在運行時的行爲方式。若是不熟悉配置建議使用默認配置。
實例:
1 <settings> 2 <setting name="cacheEnabled" value="true"/> 3 <setting name="lazyLoadingEnabled" value="true"/> 4 <setting name="multipleResultSetsEnabled" value="true"/> 5 <setting name="useColumnLabel" value="true"/> 6 <setting name="useGeneratedKeys" value="false"/> 7 <setting name="enhancementEnabled" value="false"/> 8 <setting name="defaultExecutorType" value="SIMPLE"/> 9 <setting name="defaultStatementTimeout" value="25000"/> 10 </settings> 11 12 <settings> 13 <setting name="cacheEnabled" value="true"/> 14 <setting name="lazyLoadingEnabled" value="true"/> 15 <setting name="multipleResultSetsEnabled" value="true"/> 16 <setting name="useColumnLabel" value="true"/> 17 <setting name="useGeneratedKeys" value="false"/> 18 <setting name="enhancementEnabled" value="false"/> 19 <setting name="defaultExecutorType" value="SIMPLE"/> 20 <setting name="defaultStatementTimeout" value="25000"/> 21 </settings>
3.1.2.1參數表格:
設置參數 |
描述 |
有效值 |
默認值 |
||
cacheEnabled |
這個配置使全局的映射器啓用或禁用緩存。
|
True| false |
True |
||
lazyLoadingEnabled
|
全局啓用或禁用延遲加載。當禁用時,全部關聯對象都會即時加載。
|
True| false |
True |
||
aggressiveLazyLoading
|
當啓用時,有延遲加載屬性的對象在被調用時將會徹底加載任意屬性。不然,每種屬性將會按須要加載。 |
True| false |
True |
||
multipleResultSetsEnabled |
|
True|false |
True |
||
useColumnLabel |
使用列標籤代替列名。不一樣的驅動在這方便表現不一樣。參考驅動文檔或充分測試兩種方法來決定所使用的驅動。 |
True|false |
True |
||
useGeneratedKeys |
容許JDBC支持生成的鍵。須要適合的驅動。若是設置爲true則這個設置強制生成的鍵被使用,儘管一些驅動拒絕兼容但仍然有效(好比Derby)。 |
True|false |
True |
||
autoMappingBehavior |
指定MyBatis如何自動映射列到字段/屬性。PARTIAL只會自動映射簡單,沒有嵌套的結果。FULL會自動映射任意複雜的結果(嵌套的或其餘狀況)。 |
NONE, PARTIAL, FULL
|
PARTIAL |
這些都是外部化的,可替代的屬性。其中的屬性就能夠再整個配置文件中使用,使用可替換的屬性來實現動態配置,以下
3.1.3typeAliases類型命名
實例:
1 <typeAliases> 2 <typeAlias alias="Author" type="domain.blog.Author"/> 3 <typeAlias alias="Blog" type="domain.blog.Blog"/> 4 <typeAlias alias="Comment" type="domain.blog.Comment"/> 5 <typeAlias alias="Post" type="domain.blog.Post"/> 6 <typeAlias alias="Section" type="domain.blog.Section"/> 7 <typeAlias alias="Tag" type="domain.blog.Tag"/> 8 </typeAliases>
別名是爲Java類型命名一個短的名字。它只用在XML配置文件裏,用來減小類徹底限定名的多餘部分。例如在配置文件裏須要使用domain.blog.Author的地方能夠簡單的使用Author替換。
對於普通的java類型,有不少的內建的別名。(大小寫不敏感),以下
別名 |
映射類型 |
_byte |
Byte |
_long |
Long |
_int |
Int |
_integer |
Integer |
_double |
Double |
_float |
Float |
_boolean |
Boolean |
string |
String |
byte |
Byte |
long |
Long |
short |
Short |
int |
Integer |
integer |
Integer |
double |
Double |
float |
Float |
boolean |
Boolean |
date |
Date |
decimal |
BigDecimal |
bigDecimal |
BigDecimal |
object |
Object |
map |
Map |
hashmap |
HashMap |
list |
List |
arraylist |
ArrayList |
collection |
Collection |
iterator |
Iterator |
3.1.4typeHandlers類型處理器
實例:
1 <typeHandlers> 2 <typeHandler javaType="String" jdbcType="VARCHAR" handler="org.mybatis.example.ExampleTypeHandler"/> 3 </typeHandlers>
3.1.5plugins插件
實例:
1 <plugins> 2 <plugin interceptor="org.mybatis.example.ExamplePlugin"> 3 <property name="someProperty" value="100"/> 4 </plugin> 5 </plugins> 6 <plugins> 7 <plugin interceptor="org.mybatis.example.ExamplePlugin"> 8 <property name="someProperty" value="100"/> 9 </plugin> 10 </plugins>
插件能夠改變某些類的執行, MyBatis容許被插件來攔截的類有:
1 Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 2 ParameterHandler (getParameterObject, setParameters) 3 ResultSetHandler (handleResultSets, handleOutputParameters) 4 StatementHandler (prepare, parameterize, batch, update, query) 5 Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 6 ParameterHandler (getParameterObject, setParameters) 7 ResultSetHandler (handleResultSets, handleOutputParameters) 8 StatementHandler (prepare, parameterize, batch, update, query)
3.1.6environments環境
environments裏能夠配置多個environment,每一個environment對應一個數據庫環境。一個完整的定義以下:
1 <environments default="development"> 2 <environment id="development"> 3 <transactionManager type="JDBC"> 4 </transactionManager> 5 <dataSource type="POOLED"> 6 <property name="driver" value="${driver}"/> 7 <property name="url" value="${url}"/> 8 <property name="username" value="${username}"/> 9 <property name="password" value="${password}"/> 10 </dataSource> 11 </environment> 12 </environments>
詳解結束,mybatis中配置的節點其實就是挺多的,不是很麻煩,就是多。