配置文件
配置文件的層次結構如下:
• configuration
o properties
o settings
o typeAliases
o typeHandlers
o objectFactory
o plugins
o environments
environment
• transactionManager
• dataSource
o mappers
1 properties:
用來定義外部properties配置文件信息。比如
<properties resource="org/apache/ibatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
properties>
…
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
dataSource>
那麼username和password被替換成dev_user和F2Fa3!33TYyg,而drive和url屬性將讀取config.properties中的內容從而取得具體值
properties還可以通過SqlSessionFactoryBuilder的build方法作爲參數傳入:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props);
// ... or ...
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, props);
property加載順序:
1、properties元素內部
2、外部properties文件
3、SqlSessionFactoryBuilder的build方法參數
也就是說,build方法參數中的properties優先級高於前兩個,因爲它是最後被加載,所以會覆蓋前兩種加載方法加載的properties值。
2 settings
Setting 描述 合法值 默認值
cacheEnabled 是否使用全局緩存 true|false true
lazyLoadingEnabled 是否使用全局懶加載 true|false true
multipleResultSetsEnabled 是否允許返回多個結果集合(需要兼容的驅動) true|false true
useColumnLabel 使用列標籤取代列名(不同驅動表現不同) true|false true
useGeneratedKeys 允許jdbc自動生成主鍵 true|false false
enhancementEnabled(該屬性在測試的時候報錯,提示不存在,查閱資料好像文檔裏寫錯了,這個屬性已經取消) 全局性地啓用或禁用運行時字節碼增強,以優化enhancementEnabled訪問Java Bean屬性的性能,同時優化延遲加載的性能。 true|false false
defaultExecutorType 配置默認執行方式
SIMPLE: nothing special
REUSE: reuses prepared statemets
BATCH:reuses statements and batches updates SIMPLE
REUSE
BATCH SIMPLE
defaultStatementTimeout 數據庫超時時間 Any positive
integer Not Set
(null)
例子:
cacheEnabled" value="true"/>
lazyLoadingEnabled" value="true"/>
multipleResultSetsEnabled" value="true"/>
useColumnLabel" value="true"/>
useGeneratedKeys" value="false"/>
enhancementEnabled" value="false"/>
defaultExecutorType" value="SIMPLE"/>
defaultStatementTimeout" value="25000"/>
3 typeAliases
java類別名
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
typeAliases>
4 typeHandlers
Type Handler Java Types JDBC Types
BooleanTypeHandler Boolean,boolean Any compatible BOOLEAN
ByteTypeHandler Byte,byte Any compatible NUMERIC or BYTE
ShortTypeHandler Short,short Any compatible NUMERIC or SHORT INTEGER
IntegerTypeHandler Integer,int Any compatible NUMERIC or INTEGER
LongTypeHandler Long,long Any compatible NUMERIC or LONG INTEGER
FloatTypeHandler Float,float Any compatible NUMERIC or FLOAT
DoubleTypeHandler Double,double Any compatible NUMERIC or DOUBLE
BigDecimalTypeHandler BigDecimal Any compatible NUMERIC or DECIMAL
StringTypeHandler String CHAR,VARCHAR
ClobTypeHandler String CLOB,LONGVARCHAR
NStringTypeHandler String NVARCHAR,NCHAR
NClobTypeHandler String NCLOB
ByteArrayTypeHandler byte[] Any compatible byte stream type
BlobTypeHandler byte[] BLOB,LONGVARBINARY
DateTypeHandler Date(java.util) TIMESTAMP
DateOnlyTypeHandler Date(java.util) DATE
TimeOnlyTypeHandler Date(java.util) TIME
SqlTimestampTypeHandler Timestamp(java.sql) TIMESTAMP
SqlDateTypeHadler Date(java.sql) DATE
SqlTimeTypeHandler Time(java.sql) TIME
ObjectTypeHandler Any OTHER,or unspecified
EnumTypeHandler Enumeration Type VARCHAR – any string compatible type,as the code is stored(not the index)
也可以通過實現TypeHandler接口來實現自定義的類型轉換器
// ExampleTypeHandler.java
public class ExampleTypeHandler implements TypeHandler {
public void setParameter(
PreparedStatement ps, int i, Object parameter,JdbcType jdbcType)
throws SQLException {
ps.setString(i, (String) parameter);
}
public Object getResult(
ResultSet rs, String columnName)
throws SQLException {
return rs.getString(columnName);
}
public Object getResult(
CallableStatement cs, int columnIndex)
throws SQLException {
return cs.getString(columnIndex);
}
}// MapperConfig.xml
String" jdbcType="VARCHAR"
handler="org.apache.ibatis.example.ExampleTypeHandler"/>
這樣會覆蓋原來ibatis默認的string varchar轉換器5 objectFactory
ibatis使用objectFactory去創建result object的實例對象,這裏可以自己繼承DefaultObjectFactory類實現自己的ObjectFactory
// ExampleObjectFactory.java
public class ExampleObjectFactory extends DefaultObjectFactory {
public Object create(Class type) {
return super.create(type);
}
public Object create(
Class type,
List constructorArgTypes,
List<> constructorArgs) {
return super.create(type, constructorArgTypes, constructorArgs);
}
public void setProperties(Properties properties) {
super.setProperties(properties);
}
}// MapperConfig.xml
org.apache.ibatis.example.ExampleObjectFactory">
someProperty" value="100"/>
6 plugins
ibatis允許插件截斷以下方法調用
Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)
ParameterHandler(getParameterObject,setParameters)
ResultSetHandler(handleResultSets,handleOutputParameters)
StatementHandler(prepare,parameterize,batch,update,query)
必須在理解這些方法的基礎上很小心的使用插件,不然很容易破壞ibatis的核心
// ExamplePlugin.java
@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) {
}
}
// MapperConfig.xml
org.apache.ibatis.example.ExamplePlugin">
someProperty" value="100"/>
7 environments
這個是ibatis 3非常好的一個配置,允許配置多個不懂運行環境參數,不過每個SqlSessionFactory只可以在一種環境下被創建。
利用SqlSessionFactory的build函數
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,environment,properties);
如果不知名environment參數,則應用默認的環境參數
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);
xml中如下配置:
default="development">
development">
JDBC">
" value=""/>
POOLED">
driver" value="${driver}"/>
url" value="${url}"/>
username" value="${username}"/>
password" value="${password}"/>
幾個注意點:
默認environment id: default="development">
environment id:development">
事務控制類型:JDBC">
JDBC:根據jdbc控制事務的提交和回滾
MANAGED:將事務控制轉交給容器
數據源類型:POOLED">
UNPOOLED:不使用池技術,在請求到來時直接打開或者關閉數據庫連接
必須配置的參數:driver、url、username、password
可選參數:使用driver.xxx來配置,如:driver.encoding=UTF8
POOLED:使用數據庫連接池
poolMaximumActiveConnections:同一時間內最大連接數 默認10
poolMaximumIdleConnections:連接最大空閒數目
poolMaximumCheckoutTime:連接被每個任務佔用的最大時間 默認20000ms
poolTimeToWait:連接池中無可用連接時,線程的等待時間 默認20000ms
poolPingQuery:數據庫連接狀態檢測語句,類似於ping的功能 默認NO PING QUERY SET
poolPingEnabled:是否允許ping檢測 默認false
poolPingConnectionsNotUsedFor:對超過指定空閒時間的數據庫連接進行狀態監測 默認0 (必須在poolPingEnabled設置true情況下)
JNDI:
initial_context:可選,沒看明白,原文:This property is used for the Context lookup from the InitialContext
data_source:JNDI數據庫名稱
使用env.xxx配置可選參數,如:env.encoding=UTF8
8 mappers
配置實體映射文件的路徑// Using classpath relative resources
<mappers>
<mapper resource="org/apache/ibatis/builder/AuthorMapper.xml"/>
<mapper resource="org/apache/ibatis/builder/BlogMapper.xml"/>
<mapper resource="org/apache/ibatis/builder/PostMapper.xml"/>
mappers>
// Using url fully qualified paths
<mappers>
<mapper url="file:///var/sqlmaps/AuthorMapper.xml"/>
<mapper url="file:///var/sqlmaps/BlogMapper.xml"/>
<mapper url="file:///var/sqlmaps/PostMapper.xml"/>
mappers>