以下是SqlMapConfig.xml配置文件的一個例子:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="SqlMapConfig.properties" />
<settings
enhancementEnabled="true"
azyLoadingEnabled="true"
cacheModelsEnabled="true"
errorTracingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="true"
/>
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}" />
<property name="JDBC.ConnectionURL" value="${url}" />
<property name="JDBC.Username" value="${username}" />
<property name="JDBC.Password" value="${password}" /
<property name="JDBC.DefaultAutoCommit" value="true" />
<property name="Pool.MaximumActiveConnections" value="10" />
<property name="Pool.MaximumIdleConnections" value="5" />
<property name="Pool.MaximumCheckoutTime" value="120000" />
<property name="Pool.TimeToWait" value="500" />
<property name="Pool.PingQuery" value="select 1 from users" />
<property name="Pool.PingEnabled" value="false" />
<property name="Pool.PingConnectionsOlderThan" value="1" />
<property name="Pool.PingConnectionsNotUsedFor" value="1" />
</dataSource>
</transactionManager>
<sqlMap resource="com/demo/ibatis/beans/users_SqlMap.xml" />
</sqlMapConfig>
iBatis使用 XML 配置文件統一配置不同的屬性,包括 DataSource 的詳細配置信息,SQL Map 和其他可選屬性,如線程管理等。
下面來詳細說明個部分:
<properties>元素
SQL Map 配置文件擁有唯一的<properties>元素,用於在配置文件中使用標準的 Java 屬性文件(name=value)。
這樣做後,在屬性文件中定義的屬性可以作爲變量在 SQL Map 配置文件及其包含的所有 SQL Map 映射文件中引用。
例如,如果屬性文件中包含屬性:driver=org.hsqldb.jdbcDriver。
SQL Map 配置文件及其每個映射文件都可以使用佔位符${driver}來代表值:org.hsqldb.jdbcDriver。
例如:<property name="JDBC.Driver"value="${driver}"/>
屬性文件可以從類路徑中加載(使用resource屬性),也可以從合法的 URL 中加載(使用url 屬性)。
例如,要加載固定路徑的屬性文件,使用:<properties url=”file:///c:/config/my.properties” />
<setting>元素
<setting>元素用於配置和優化 SqlMapClient實例的各選項。<setting>元素本身及其所有的屬性都是可選的。具體請看下錶:
maxRequests |
同時執行 SQL 語句的最大線程數。大於這個值的線程將阻塞直到另一個線程執行完成。不同的 DBMS有不同的限制值,但任何數據庫都有這些限制。通常這個值應該至少是 maxTransactions(參見以下)的 10 倍 , 並 且 總 是 大 於 maxSessions 和maxTranactions。減小這個參數值通常能提高性能。 |
maxSessions |
同一時間內活動的最大 session 數。一個 session 可以是代碼請求的顯式 session,也可以是當線程使用SqlMapClient 實例(即執行一條語句)自動獲得的session。它應該總是大於或等於 maxTransactions 並小於 maxRequests。減小這個參數值通常能減少內存使用。 例如:maxSessions=“64” 缺省值:128 |
maxTransactions |
同時進入 SqlMapClient.startTransaction()的最大線程數。大於這個值的線程將阻塞直到另一個線程退出。不同的 DBMS 有不同的限制值,但任何數據庫都有這些限制。這個參數值應該總是小於或等於 maxSessions 並總是遠遠小於 maxRequests。減小這個參數值通常能提高性能。 例如:maxTransactions=“16” 缺省值:32 |
cacheModelsEnabled |
全局性地啓用或禁用 SqlMapClient 的所有緩存model。調試程序時使用。 例如:cacheModelsEnabled=“true” 缺省值:true(啓用) |
lazyLoadingEnabled |
全局性地啓用或禁用SqlMapClient的所有延遲加載。調試程序時使用。 例子:lazyLoadingEnabled=“true” 缺省值:true(啓用) |
enhancementEnabled |
全局性地啓用或禁用運行時字節碼增強,以優化訪問 Java Bean 屬性的性能,同時優化延遲加載的性能。 例子:enhancementEnabled=“true” 缺省值:false(禁用) |
useStatementNamespaces |
如果啓用本屬性,必須使用全限定名來引用 mappedstatement。Mapped statement 的全限定名由 sql-map的名稱和 mapped-statement 的名稱合成。例如: queryForObject(“sqlMapName.statementName”); 例子:useStatementNamespaces=“false” 缺省值:false(禁用) |
errorTracingEnabled |
是否啓用錯誤日誌,在開發期間建議設爲"true" 以方便調試 例子:errorTracingEnabled=“true” 缺省值:false(禁用) |
<transactionManager>元素
<transationManager>元素爲 SQL Map 配置事務管理服務。屬性 type 指定所使用的事務管理器類型。這個屬性值可以是一個類名,也可以是一個別名。
包含在框架的三個事務管理器分別是:JDBC,JTA 和 EXTERNAL。
1. JDBC:通過常用的 Connection commit()和 rollback()方法,讓 JDBC 管理事務。
2. JTA:本事務管理器使用一個 JTA 全局事務,使 SQL Map 的事務包括在更大的事務範圍內,這個更大的事務範圍可能包括了其他的數據庫和事務資源。
這個配置需要一個UserTransaction屬性,以便從JNDI獲得一個UserTransaction。參見以下JNDI數據源的例子。
3. EXTERNAL:這個配置可以我們自己管理事務。我們仍然可以配置一個數據源,但事務不再作爲框架生命週期的一部分被提交或回退。
這意味着 SQL Map 外部應用的一部分必須自己管理事務。這個配置也可以用於沒有事務管理的數據庫(例如只讀數據庫)。
<datasource>元素
<datasource>是<transactionManager>的一部分,爲 SQL Map 數據源設置了一系列參數。目前 SQL Map 架構只提供三個 DataSource Factory,分別爲:
SimpleDataSourceFactory(別稱爲SIMPLE)、DbcpDataSourceFactory(別稱爲DBCP)、JndiDataSourceFactory(別稱爲JNDI)
但我們也可以添加自己的實現。下面簡單地說明一下 三個DataSourceFactory。
SimpleDataSourceFactory:
SimpleDataSourceFactory 爲 DataSource 提供了一個基本的實現,適用於在沒有 J2EE 容器提供 DataSource 的情況。它基於 iBatis 的 SimpleDataSource 連接池實現。配置例子:
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="org.postgresql.Driver"/>
<property name="JDBC.ConnectionURL" value="jdbc:postgresql://server:5432/dbname"/>
<property name="JDBC.Username" value="user"/>
<property name="JDBC.Password" value="password"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="120000"/>
<property name="Pool.TimeToWait" value="10000"/>
<property name="Pool.PingQuery" value="select * from dual"/>
<property name="Pool.PingEnabled" value="false"/>
<property name="Pool.PingConnectionsOlderThan" value="0"/>
<property name="Pool.PingConnectionsNotUsedFor" value="0"/>
</dataSource>
</transactionManager>
DbcpDataSourceFactory:
DbcpDataSourceFactory 實現使用 Jakarta DBCP(Database Connection Pool)的 DataSource API 提供連接池服務。適用於應用/Web 容器不提供 DataSource 服務的情況,或執行一個單獨的應用。配置例子:
<transactionManager type="JDBC">
<dataSource type="DBCP">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${username}"/>
<property name="JDBC.Password" value="${password}"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumWait" value="60000"/>
<!-- Use of the validation query can be problematic.
If you have difficulty, try without it. -->
<property name="Pool.ValidationQuery" value="select * from ACCOUNT"/>
<property name="Pool.LogAbandoned" value="false"/>
<property name="Pool.RemoveAbandoned" value="false"/>
<property name="Pool.RemoveAbandonedTimeout" value="50000"/>
</datasource>
</transactionManager>
JndiDataSourceFactory:
JndiDataSourceFactory 在應用容器內部從 JNDI Context 中查找 DataSource 實現。當使用應用服務器,並且服務器提供了容器管理的連接池和相關 DataSource 實現的情況下,可以使用 JndiDataSourceFactory。使用 JDBC DataSource 的標準方法是通過 JNDI 來查找。配置例子:
<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>
</dataSource>
</transactionManager>
以上配置使用了常用的 JDBC 事務管理。但對於容器管理的資源,您可能需要象下面的例子一樣配置,讓它能和全局事務一起工作:
<transactionManager type="JTA" >
<property name="UserTransaction" value="java:/ctx/con/UserTransaction"/>
<dataSource type="JNDI">
<property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>
</dataSource>
</transactionManager>
注意,UserTransaction 屬性指向 UserTransaction 實例所在的 JNDI 位置。JTA 事務管理需要它,以使 SQL Map 能夠參與涉及其他數據庫和事務資源的範圍更大的事務。
<sqlMap>元素
<sqlMap>元素用於包括 SQL Map 映射文件和其他的 SQL Map 配置文件。每個SqlMapClient 對象使用的所有 SQL Map 映射文件都要在此聲明。
映射文件作爲 stream resource 從類路徑或 URL 讀入。您必須在這裏指定所有的 SQL Map 文件。例子如下:
<!-- CLASSPATH RESOURCES -->以下是類路徑讀入的
<sqlMap resource="com/ibatis/examples/sql/Customer.xml" />
<sqlMap resource="com/ibatis/examples/sql/Account.xml" />
<sqlMap resource="com/ibatis/examples/sql/Product.xml" />
<!-- URL RESOURCES -->以下是url讀入
<sqlMap url="file:///c:/config/Customer.xml " />
<sqlMap url="file:///c:/config/Account.xml " />
<sqlMap url="file:///c:/config/Product.xml" />