MyBatis 的 XML 配置文件包含了影響 MyBatis 行為甚深的設(shè)置和屬性信息。XML 文檔
的高層級(jí)結(jié)構(gòu)如下:
這些是外部化的,可替代的屬性,這些屬性也可以配置在典型的 Java 屬性配置文件中,或者通過(guò) properties 元素的子元素來(lái)傳遞。
例如:
<properties resource="jdbc.properties"></properties>
其中的屬性就可以在整個(gè)配置文件中使用,使用可替換的屬性來(lái)實(shí)現(xiàn)動(dòng)態(tài)配置。
比如:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
properties 將會(huì)從包含進(jìn)來(lái)的 jdbc.properties 文件中的值來(lái)替換。
<br/>
下面這個(gè)表格描述了設(shè)置信息,它們的含義和默認(rèn)值。
一個(gè)設(shè)置信息元素的示例,完全的配置如下所示:
<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類(lèi)型別名是為 Java 類(lèi)型命名一個(gè)短的名字。它只和 XML 配置有關(guān),只用來(lái)減少類(lèi)完全限定名的多余部分。
例如:
<typeAliases>
<typeAlias alias="User" type="com.mu.mybatis.domain.User"/>
</typeAliases>
使用這個(gè)配置,“User”可以任意用來(lái)替代“com.mu.mybatis.domain.User”所使用的地方。
typeHandlers無(wú)論是 MyBatis 在預(yù)處理語(yǔ)句中設(shè)置一個(gè)參數(shù),還是從結(jié)果集中取出一個(gè)值時(shí),類(lèi)型處理器被用來(lái)將獲取的值以合適的方式轉(zhuǎn)換成 Java 類(lèi)型。下面這個(gè)表格描述了默認(rèn)的類(lèi)型處理器。
你可以重寫(xiě)類(lèi)型處理器或創(chuàng)建你自己的類(lèi)型處理器來(lái)處理不支持的或非標(biāo)準(zhǔn)的類(lèi)型。要這樣做的話,簡(jiǎn)單實(shí)現(xiàn) TypeHandler 接口(org.mybatis.type),然后映射新的類(lèi)型處理器類(lèi)到Java 類(lèi)型,還有可選的一個(gè) JDBC 類(lèi)型。例如:
// 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
<typeHandlers>
<typeHandler javaType="String" jdbcType="VARCHAR"
handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
使用這樣的類(lèi)型處理器將會(huì)覆蓋已經(jīng)存在的處理 Java 的 String 類(lèi)型屬性和 VARCHAR參數(shù)及結(jié)果的類(lèi)型處理器。要注意 MyBatis 不會(huì)審視數(shù)據(jù)庫(kù)元信息來(lái)決定使用哪種類(lèi)型,所以你必須在參數(shù)和結(jié)果映射中指定那是 VARCHAR 類(lèi)型的字段,來(lái)綁定到正確的類(lèi)型處理器上。這是因?yàn)?MyBatis 直到語(yǔ)句被執(zhí)行都不知道數(shù)據(jù)類(lèi)型的這個(gè)現(xiàn)實(shí)導(dǎo)致的.
objectFactoryMyBatis 每次創(chuàng)建結(jié)果對(duì)象新的實(shí)例時(shí),它使用一個(gè) ObjectFactory 實(shí)例來(lái)完成。如果參數(shù)映射存在,默認(rèn)的 ObjectFactory 不比使用默認(rèn)構(gòu)造方法或帶參數(shù)的構(gòu)造方法實(shí)例化目標(biāo)類(lèi)做的工作多。如果你想重寫(xiě)默認(rèn)的 ObjectFactory,你可以創(chuàng)建你自己的。
比如:
// ExampleObjectFactory.java
public class ExampleObjectFactory extends DefaultObjectFactory {
public Object create(Class type) {
return super.create(type);
}
public Object create(Class type,List<Class> constructorArgTypes,List<Object> constructorArgs) {
return super.create(type, constructorArgTypes, constructorArgs);
}
public void setProperties(Properties properties) {
super.setProperties(properties);
}
}
// MapperConfig.xml
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
<property name="someProperty" value="100"/>
</objectFactory>
ObjectFactory 接口非常簡(jiǎn)單。它包含兩個(gè)用于創(chuàng)建的方法,一個(gè)是默認(rèn)構(gòu)造方法,另外一個(gè)是處理帶參數(shù)的構(gòu)造方法。最終,setProperties 方法可以被用來(lái)配置 ObjectFactory。在初始化你的ObjectFactory實(shí)例后,objectFactory元素體中定義的屬性會(huì)被傳遞給setProperties方法。
pluginsMyBatis 允許你在某一點(diǎn)攔截已映射語(yǔ)句執(zhí)行的調(diào)用。
默認(rèn)情況下,MyBatis 允許使用插件來(lái)攔截方法調(diào)用:
Executor
(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler
(getParameterObject, setParameters)
ResultSetHandler
(handleResultSets, handleOutputParameters)
這些類(lèi)中方法的詳情可以通過(guò)查看每個(gè)方法的簽名來(lái)發(fā)現(xiàn),而且它們的源代碼存在于MyBatis 的發(fā)行包中。你應(yīng)該理解你所覆蓋方法的行為,假設(shè)你所做的要比監(jiān)視調(diào)用要多。
如果你嘗試修改或覆蓋一個(gè)給定的方法,你可能會(huì)打破 MyBatis 的核心。這是低層次的類(lèi)和方法,要謹(jǐn)慎使用插件。
使用插件是它們提供的非常簡(jiǎn)單的力量。簡(jiǎn)單實(shí)現(xiàn)攔截器接口,要確定你想攔截的指定簽名。
// 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
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
上面的插件將會(huì)攔截在 Executor 實(shí)例中所有的“update”方法調(diào)用,它也是負(fù)責(zé)低層次映射語(yǔ)句執(zhí)行的內(nèi)部對(duì)象。
environmentsMyBatis 可以配置多種環(huán)境。這會(huì)幫助你將 SQL 映射應(yīng)用于多種數(shù)據(jù)庫(kù)之中。例如,你也許為開(kāi)發(fā)要設(shè)置不同的配置,測(cè)試和生產(chǎn)環(huán)境。或者你可能有多種生產(chǎn)級(jí)數(shù)據(jù)庫(kù)卻共享相同的模式,所以你會(huì)想對(duì)不同數(shù)據(jù)庫(kù)使用相同的 SQL 映射。這種用例是很多的。
要記得一個(gè)很重要的問(wèn)題:你可以配置多種環(huán)境,但你只能為每個(gè) SqlSessionFactory實(shí)例選擇一個(gè)。
所以,如果你想連接兩個(gè)數(shù)據(jù)庫(kù),你需要?jiǎng)?chuàng)建兩個(gè) SqlSessionFactory 實(shí)例,每個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)。而如果是三個(gè)數(shù)據(jù)庫(kù),你就需要三個(gè)實(shí)例,以此類(lèi)推。記憶起來(lái)很簡(jiǎn)單:
每個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè) SqlSessionFactory為了明確創(chuàng)建哪種環(huán)境,你可以將它作為可選的參數(shù)傳遞給 SqlSessionFactoryBuilder。
可以接受環(huán)境配置的兩個(gè)方法簽名是:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);
如果環(huán)境被忽略,那么默認(rèn)環(huán)境將會(huì)被加載,如下進(jìn)行:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);
環(huán)境元素定義了如何配置環(huán)境。
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
注意這里的關(guān)鍵部分:
<br/>
transactionManager在 MyBatis 中有兩種事務(wù)管理器類(lèi)型(也就是 type=”[JDBC|MANAGED]”):
JDBC – 這個(gè)配置直接簡(jiǎn)單使用了 JDBC 的提交和回滾設(shè)置。它依賴(lài)于從數(shù)據(jù)源得到的連接來(lái)管理事務(wù)范圍。
<br/>
dataSsourcedataSource 元素使用基本的 JDBC 數(shù)據(jù)源接口來(lái)配置 JDBC 連接對(duì)象的資源。許多 MyBatis 的應(yīng)用程序?qū)?huì)按示例中的例子來(lái)配置數(shù)據(jù)源。然而它并不是必須的。
要知道為了方便使用延遲加載,數(shù)據(jù)源才是必須的。
有三種內(nèi)建的數(shù)據(jù)源類(lèi)型(也就是 type=”???”):
UNPOOLED 類(lèi)型的數(shù)據(jù)源僅僅用來(lái)配置以下 5 種屬性:
driver – 這是 JDBC 驅(qū)動(dòng)的 Java 類(lèi)的完全限定名
url – 這是數(shù)據(jù)庫(kù)的 JDBC URL 地址
username – 登錄數(shù)據(jù)庫(kù)的用戶(hù)名
password – 登錄數(shù)據(jù)庫(kù)的密碼
defaultTransactionIsolationLevel – 默認(rèn)的連接事務(wù)隔離級(jí)別
作為可選項(xiàng),你可以傳遞數(shù)據(jù)庫(kù)驅(qū)動(dòng)的屬性。要這樣做,屬性的前綴是以“driver.”開(kāi)
頭的,例如:
這 樣 就 會(huì) 傳 遞 以 值 “ UTF8 ” 來(lái) 傳 遞 “ encoding ” 屬 性 , 它 是 通 過(guò)DriverManager.getConnection(url,driverProperties)方法傳遞給數(shù)據(jù)庫(kù)驅(qū)動(dòng)。
除了上述(UNPOOLED)的屬性之外,還有很多屬性可以用來(lái)配置 POOLED 數(shù)據(jù)源:
poolMaximumActiveConnections – 在任意時(shí)間存在的活動(dòng)(也就是正在使用)連接的數(shù)量。默認(rèn)值:10
poolMaximumIdleConnections – 任意時(shí)間存在的空閑連接數(shù)。
poolMaximumCheckoutTime – 在被強(qiáng)制返回之前,池中連接被檢查的時(shí)間。默認(rèn)值:20000 毫秒(也就是 20 秒)
poolTimeToWait – 這是給連接池一個(gè)打印日志狀態(tài)機(jī)會(huì)的低層次設(shè)置,還有重新嘗試獲得連接,這些情況下往往需要很長(zhǎng)時(shí)間(為了避免連接池沒(méi)有配置時(shí)靜默失?。DJ(rèn)值:20000 毫秒(也就是 20 秒)
poolPingQuery – 發(fā)送到數(shù)據(jù)的偵測(cè)查詢(xún),用來(lái)驗(yàn)證連接是否正常工作,并且準(zhǔn)備接受請(qǐng)求。默認(rèn)是“NO PING QUERY SET”,這會(huì)引起許多數(shù)據(jù)庫(kù)驅(qū)動(dòng)連接由一個(gè)錯(cuò)誤信息而導(dǎo)致失敗。
poolPingEnabled – 這是開(kāi)啟或禁用偵測(cè)查詢(xún)。如果開(kāi)啟,你必須用一個(gè)合法的SQL 語(yǔ)句設(shè)置 poolPingQuery 屬性。默認(rèn)值:false。
JNDI – 這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)是為了使用如 Spring 或應(yīng)用服務(wù)器這類(lèi)的容器,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個(gè) JNDI 上下文的引用。這個(gè)數(shù)據(jù)源配置只需要兩個(gè)屬性:
initial_context – 這 個(gè) 屬 性 用 來(lái) 從 初 始 上 下 文 中 尋 找 環(huán) 境 。這是個(gè)可選屬性,如果被忽略,那么data_source 屬性將會(huì)直接以 initialContext 為背景再次尋找。
data_source – 這是引用數(shù)據(jù)源實(shí)例位置的上下文的路徑。它會(huì)以由 initial_context查詢(xún)返回的環(huán)境為背景來(lái)查找,如果 initial_context 沒(méi)有返回結(jié)果時(shí),直接以初始上下文為環(huán)境來(lái)查找。
和其他數(shù)據(jù)源配置相似,它也可以通過(guò)名為“env.”的前綴直接向初始上下文發(fā)送屬性。
<br/>
mappers既然 MyBatis 的行為已經(jīng)由上述元素配置完了,我們現(xiàn)在就要定義 SQL 映射語(yǔ)句了。但是,首先我們需要告訴 MyBatis 到哪里去找到這些語(yǔ)句。Java 在這方面沒(méi)有提供一個(gè)很好的方法,所以最佳的方式是告訴 MyBatis 到哪里去找映射文件。
<mappers>
<mapper resource="com/mu/mybatis/mapper/UserMapper.xml"/>
</mappers>
這些語(yǔ)句簡(jiǎn)單告訴了 MyBatis 去×××映射文件。
文章標(biāo)題:02.Mybatis的xml映射配置文件-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://muchs.cn/article6/coseig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、品牌網(wǎng)站設(shè)計(jì)、域名注冊(cè)、網(wǎng)站導(dǎo)航、外貿(mào)建站、網(wǎng)站營(yíng)銷(xiāo)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容