這篇文章學習的是mybatis的主配置文件Configuration.xml,這個配置文件主要配置一些全局的屬性,如數據庫的連接,類的別名,不同的
場景運行不同的配置等等。
一、Configuration.xml中可以配置的所有內容
configuration 配置 | | | |
| properties 屬性 | | |
| settings 設置 | | |
| typeAliases 類型命名 | | |
| typeHandlers 類型處理器 | | |
| objectFactory 對象工廠 | | |
| plugins 插件 | | |
| environments 環境 | | |
| | environment 環境變量 | |
| | | transactionManager 事務管理器 |
| | | dataSource 數據源 |
| 映射器 | | |
二、Properties標簽
可以用來引用外部的屬性文件進行配置,比如所有的配置都在一個eas.properties中配置,只需要在properties中配置一次,就可以做到一次配置到處引用。
如現在配置一個eas.properties
- #db config
- db.driver:com.sybase.jdbc3.jdbc.SybDriver
- db.url:jdbc:sybase:Tds:192.168.2.143:2678/SMM_win2k8_portal
- db.username:dba
- db.password:smmsql
-
- #server config
- server.url:http://192.168.2.101:8080/EAS
在configuration.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 resource="eas.properties" />
-
- <environments default="development">
- <environment id="development">
- <transactionManager type="JDBC"/>
- <dataSource type="POOLED">
- <property name="driver" value="${db.driver}"/>
- <property name="url" value="${db.url}"/>
- <property name="username" value="${db.username}"/>
- <property name="password" value="${db.password}"/>
- </dataSource>
- </environment>
- </environments>
- </configuration>
三、Setteing標簽,對mybatis的一些行為進行設置

配置
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="enhancementEnabled" value="false"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
< /settings>
四、typeAliases 為一類設置別名,方便書寫
- <typeAliases>
-
- <typeAlias alias="App" type="com.justsy.eas.domain.App"/>
- <typeAlias alias="Content" type="com.justsy.eas.domain.Content"/>
- <typeAlias alias="AppDevice" type="com.justsy.eas.domain.AppDevice"/>
- <typeAlias alias="ListApp" type="com.justsy.eas.http.domain.ListApp"/>
- <typeAlias alias="ClientApp" type="com.justsy.eas.http.domain.ClientApp"/>
- </typeAliases>
java 中一些簡單類型的別名
別名 映射的類型
_byte byte
_long long
_short short
_int int
_integer int
_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
五、typeHandlers 的作用是將Java類型與數據庫中類型進行匹配,在statement設值和ResultSet檢索值時可以正確的轉換,可以實現TypeHandler接口實現自己的類型處理器。mybatis中內建的類型處理器(Type Handler )

六、ObjectFactory 每次創建新的結果對象是調用這個ObjectFactory的對象來進行創建,它會比直接調用構造函數創建對象做更多的工作
七、plugins主要用來實現攔截器的功能,使用到了動態代理,可以指定在某些操作時執行一些攔截操作,比如在一條記錄插入數據庫之前寫入一條日志,或查詢一下
權限等等
? Executor
(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
? ParameterHandler
(getParameterObject, setParameters)
? ResultSetHandler
(handleResultSets, handleOutputParameters)
? StatementHandler
(prepare, parameterize, batch, update, query)
-
- @Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })
- public class ExamplePlugin implements Interceptor {
- public Object intercept(Invocation invocation) throws Throwable {
- return invocation.proceed();
- }
-
- public Object plugin(Object target) {
- return Plugin.wrap(target, this);
- }
-
- public void setProperties(Properties properties) {
- }
- }
- <plugins>
- <plugin interceptor="org.mybatis.example.ExamplePlugin">
- <property name="someProperty" value="100"/>
- </plugin>
- </plugins>
就會在所有執行update動作之前進行攔截,執行ExamplePlugin中自定義的一些邏輯
對select進行攔截的plugin
- import org.apache.ibatis.session.ResultHandler;
- import org.apache.ibatis.session.RowBounds;
-
- @Intercepts({ @Signature(args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }, method = "query", type = Executor.class) })
- public class LogInterceptor implements Interceptor {
-
- int index;
-
- @Override
- public Object intercept(Invocation invocation) throws Throwable {
- System.out.println("some log!!!");
- return invocation.proceed();
- }
-
- @Override
- public Object plugin(Object target) {
- System.out.println("1223--------------" + (index++));
- return Plugin.wrap(target, this);
- }
-
- @Override
- public void setProperties(Properties properties) {
-
- }
- }
- <plugins>
- <plugin interceptor="com.akwolf.interceptor.LogInterceptor">
- </plugin>
- </plugins>
八、environments 對于一個應用可能連接多個數據庫,那就需要配置不同的環境來連接不同的數據庫,每一個SqlSessionFactory對應一個environments
也可以設置不同的環境應用于開發或測試的環境
如果環境被忽略,那么默認環境將會被加載,也就是default="development"的作用了
九、transactionManager設置事物的管理類型是 type=”[JDBC|MANAGED]”
JDBC使用datasource的連接來管理事物范圍。
MANAGED自己不進行事物的提交和回滾,依靠容器來管理事物,設置closeConnection為false,取消自動關閉連接
- <transactionManager type="MANAGED">
- <property name="closeConnection" value="false"/>
- </transactionManager>
十、dataSource設置數據源[UNPOOLED|POOLED|JNDI]
POOLED:每次被請求時簡單打開和關閉連接
POOLED:JDBC 連接對象的數據源連接池的實現,用來避免創建新的連接實例時必要的初始連接和認證時間。
poolMaximumActiveConnections – 在任意時間存在的活動(也就是正在使用)連接的數量。默認值:10
poolMaximumIdleConnections – 任意時間存在的空閑連接數。
oolMaximumCheckoutTime – 在被強制返回之前,池中連接被檢查的時間。默認值:20000 毫秒(也就是 20 秒)
poolTimeToWait – 這是給連接池一個打印日志狀態機會的低層次設置,還有重新嘗試獲得連接,這些情況下往往需要很長時間(為了避免連接池沒有配置時靜默失敗)。 默認值:20000 毫秒(也就是 20 秒)
poolPingQuery – 發送到數據的偵測查詢,用來驗證連接是否正常工作,并且準備接受請求。默認是“NO PING QUERY SET”,這會引起許多數據庫驅動連接由一個錯誤信 息而導致失敗。
poolPingEnabled – 這是開啟或禁用偵測查詢。如果開啟,你必須用一個合法的SQL語句(最好是很快速的)設置 poolPingQuery 屬性。默認值:false。
poolPingConnectionsNotUsedFor – 這是用來配置 poolPingQuery 多次時間被用一次。這可以被設置匹配標準的數據庫連接超時時間,來避免不必要的偵測。默認值:0 (也就是所有連接每一時刻都被偵測-但僅僅當 poolPingEnabled 為 true 時適用)。
JNDI – 這個數據源的實現是為了使用如 Spring 或應用服務器這類的容器,容器可以集中或在外部配置數據源,然后放置一個 JNDI 上下文的引用。
initial_context – 這個屬性用來從初始上下文中尋找環境(也就是initialContext.lookup(init ial——context))。這是個可選屬性,如果被忽略,那么data_source 屬性將 會直接以 init ialContext 為背景再次尋找。
data_source – 這是引用數據源實例位置的上下文的路徑。它會以由 init ial_context查詢返回的環境為背景來查找,如果 init ial_context 沒有返回結果時,直接以初始上下 文為環境來查找。
十一、mappers用來注冊映射文件。