欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于MyBatis XML配置方法(全面了解)

 更新時(shí)間:2017年06月22日 08:49:23   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇基于MyBatis XML配置方法(全面了解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

MyBatis 的配置文件包含了影響 MyBatis 行為甚深的設(shè)置(settings)和屬性(properties)信息。

文檔的頂層結(jié)構(gòu)如下:

configuration 配置
properties 屬性
settings 設(shè)置
typeAliases 類(lèi)型命名
typeHandlers 類(lèi)型處理器
objectFactory 對(duì)象工廠(chǎng)
plugins 插件
environments 環(huán)境
environment 環(huán)境變量
transactionManager 事務(wù)管理器
dataSource 數(shù)據(jù)源
databaseIdProvider 數(shù)據(jù)庫(kù)廠(chǎng)商標(biāo)識(shí)
mappers 映射器
properties 屬性

這些屬性都是可外部配置且可動(dòng)態(tài)替換的,既可以在典型的 Java 屬性文件中配置,亦可通過(guò) properties 元素的子元素來(lái)傳遞,配置示例:

<!-- resource 表示 properties 文件路徑,引用該文件的 property -->

<properties resource="org/mybatis/example/config.properties">

  <property name="username" value="dev_user"/>

  <property name="password" value="F2Fa3!33TYyg"/>

</properties>

配置 properties 后,可以在其他配置中使用 property,示例如下:

<dataSource type="POOLED">

  <property name="driver" value="${driver}"/>

  <property name="url" value="${url}"/>

  <property name="username" value="${username}"/>

  <property name="password" value="${password}"/>

</dataSource>

這個(gè)例子中的 username 和 password 將會(huì)由 properties 元素中設(shè)置的相應(yīng)值來(lái)替換。

如果屬性在不只一個(gè)地方進(jìn)行了配置,那么 MyBatis 將按照下面的順序來(lái)加載:

在 properties 元素體內(nèi)指定的屬性首先被讀取。

然后根據(jù) properties 元素中的 resource 屬性讀取類(lèi)路徑下屬性文件或根據(jù) url 屬性指定的路徑讀取屬性文件,并覆蓋已讀取的同名屬性。

最后讀取作為方法參數(shù)傳遞的屬性,并覆蓋已讀取的同名屬性。

因此,通過(guò)方法參數(shù)傳遞的屬性具有最高優(yōu)先級(jí),resource/url 屬性中指定的配置文件次之,最低優(yōu)先級(jí)的是 properties 屬性中指定的屬性

MyBatis 3.4.2 增加了默認(rèn)值,可以通過(guò) ${username:ut_user} 來(lái)設(shè)置默認(rèn)值,可以通過(guò)配置 property 來(lái)啟用默認(rèn)值,或者設(shè)置默認(rèn)值的分隔符,如下配置:

<!-- 啟用默認(rèn)值 -->

<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
<!-- 設(shè)置默認(rèn)值分隔符 -->

<property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value=":"/>

settings 屬性

這是 MyBatis 中極為重要的調(diào)整設(shè)置,它們會(huì)改變 MyBatis 的運(yùn)行時(shí)行為,完整屬性及說(shuō)明表可以參考鏈接。一個(gè)配置完整的示例如下:

<settings>

  <!-- 該配置影響的所有映射器中配置的緩存的全局開(kāi)關(guān) -->

  <setting name="cacheEnabled" value="true" />

  <!-- 延遲加載的全局開(kāi)關(guān) -->

  <setting name="lazyLoadingEnabled" value="true" />

  <!-- 是否允許單一語(yǔ)句返回多結(jié)果集(需要兼容驅(qū)動(dòng)) -->

  <setting name="multipleResultSetsEnabled" value="true" />

  <!-- 使用列標(biāo)簽代替列名 -->

  <setting name="useColumnLabel" value="true" />

  <!-- 允許 JDBC 支持自動(dòng)生成主鍵,需要驅(qū)動(dòng)兼容 -->

  <setting name="useGeneratedKeys" value="false" />

  <!-- 當(dāng)檢測(cè)出未知列(或未知屬性)時(shí),如何處理 -->

  <setting name="autoMappingUnknownColumnBehavior" value="WARNING" />

  <!-- 配置默認(rèn)的執(zhí)行器 -->

  <setting name="defaultExecutorType" value="SIMPLE" />

  <!-- 設(shè)置超時(shí)時(shí)間 -->

  <setting name="defaultStatementTimeout" value="25" />

  <!-- 為驅(qū)動(dòng)的結(jié)果集獲取數(shù)量 -->

  <setting name="defaultFetchSize" value="100" />

  <!-- 允許在嵌套語(yǔ)句中使用分頁(yè) -->

  <setting name="safeRowBoundsEnabled" value="false" />

  <!-- 是否開(kāi)啟自動(dòng)駝峰命名規(guī)則(camel case)映射,即從數(shù)據(jù)庫(kù)列名 A_COLUMN 到經(jīng)典 Java 屬性名 aColumn 的類(lèi)似映射 -->

  <setting name="mapUnderscoreToCamelCase" value="false" />

  <!-- 利用本地緩存機(jī)制 -->

  <setting name="localCacheScope" value="SESSION" />

  <!-- 當(dāng)沒(méi)有為參數(shù)提供特定的 JDBC 類(lèi)型時(shí),為空值指定 JDBC 類(lèi)型 -->

  <setting name="jdbcTypeForNull" value="OTHER" />

  <!-- 指定哪個(gè)對(duì)象的方法觸發(fā)一次延遲加載 -->

<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />

</settings>

typeAliases 屬性

類(lèi)型別名是為 Java 類(lèi)型設(shè)置一個(gè)短的名字。它只和 XML 配置有關(guān),存在的意義僅在于用來(lái)減少類(lèi)完全限定名的冗余。指定別名配置如下:

<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>

也可以指定一個(gè)包名,MyBatis 會(huì)搜索包名下面的需要的 Java Bean ,比如:

<typeAliases>

  <package name="domain.blog"/>

</typeAliases>

每一個(gè)在包 domain.blog 中的 Java Bean,在沒(méi)有注解的情況下,會(huì)使用 Bean 的首字母小寫(xiě)的非限定類(lèi)名來(lái)作為它的別名。 比如 domain.blog.Author 的別名為 author;若有注解,則別名為其注解值??聪旅娴睦樱?/p>

@Alias("author")

public class Author {

  ...

}

已經(jīng)為許多常見(jiàn)的 Java 類(lèi)型內(nèi)建了相應(yīng)的類(lèi)型別名。它們都是大小寫(xiě)不敏感的,需要注意的是由基本類(lèi)型名稱(chēng)重復(fù)導(dǎo)致的特殊處理,內(nèi)建相應(yīng)的類(lèi)型表參見(jiàn)鏈接 。

typeHandlers 屬性

無(wú)論是 MyBatis 在預(yù)處理語(yǔ)句(PreparedStatement)中設(shè)置一個(gè)參數(shù)時(shí),還是從結(jié)果集中取出一個(gè)值時(shí), 都會(huì)用類(lèi)型處理器將獲取的值以合適的方式轉(zhuǎn)換成 Java 類(lèi)型,默認(rèn)的類(lèi)型處理器參考鏈接??梢灾貙?xiě)類(lèi)型處理器或創(chuàng)建自己的類(lèi)型處理器來(lái)處理不支持的或非標(biāo)準(zhǔn)的類(lèi)型。 具體做法為:實(shí)現(xiàn) org.apache.ibatis.type.TypeHandler 接口, 或繼承一個(gè)很便利的類(lèi) org.apache.ibatis.type.BaseTypeHandler, 然后可以選擇性地將它映射到一個(gè) JDBC 類(lèi)型,示例代碼:

自定義TypeHandler 代碼

package org.mybatisExamples.simple;

  

import java.sql.*;

  

import org.apache.ibatis.type.BaseTypeHandler;

import org.apache.ibatis.type.JdbcType;

// 繼承基類(lèi)重寫(xiě)方法,通過(guò)類(lèi)型處理器的泛型,MyBatis 可以得知該類(lèi)型處理器處理的 Java 類(lèi)型

public class StringTypeHandler extends BaseTypeHandler<String> {

  

  @Override

  public String getNullableResult(ResultSet arg0, String arg1) throws SQLException {

    System.out.printf("getNullableResult arg1=%s%n", arg1);

    return arg0.getString(arg1);

  }

  

  @Override

  public String getNullableResult(ResultSet arg0, int arg1) throws SQLException {

    System.out.printf("getNullableResult arg1=%d%n", arg1);

    return arg0.getString(arg1);

  }

  

  @Override

  public String getNullableResult(CallableStatement arg0, int arg1) throws SQLException {

    System.out.printf("getNullableResult arg1=%d%n", arg1);

    return arg0.getString(arg1);

  }

  

  @Override

  public void setNonNullParameter(PreparedStatement arg0, int arg1, String arg2, JdbcType arg3) throws SQLException {

    System.out.printf("Index=%d Value=%s JdbcType=%s%n", arg1, arg2, arg3);

    arg0.setString(arg1, arg2);

  }

}

配置文件代碼:

<typeHandlers>

  <typeHandler handler="org.mybatisExamples.simple.StringTypeHandler"/>

</typeHandlers>

通過(guò)類(lèi)型處理器的泛型,MyBatis 可以得知該類(lèi)型處理器處理的 Java 類(lèi)型,不過(guò)這種行為可以通過(guò)兩種方法改變:

在類(lèi)型處理器的配置元素(typeHandler element)上增加一個(gè) javaType 屬性(比如:javaType="String");

在類(lèi)型處理器的類(lèi)上(TypeHandler class)增加一個(gè) @MappedTypes 注解來(lái)指定與其關(guān)聯(lián)的 Java 類(lèi)型列表。 如果在 javaType 屬性中也同時(shí)指定,則注解方式將被忽略。

可以通過(guò)兩種方式來(lái)指定被關(guān)聯(lián)的 JDBC 類(lèi)型:

在類(lèi)型處理器的配置元素上增加一個(gè) jdbcType 屬性(比如:jdbcType="VARCHAR");

在類(lèi)型處理器的類(lèi)上(TypeHandler class)增加一個(gè) @MappedJdbcTypes 注解來(lái)指定與其關(guān)聯(lián)的 JDBC 類(lèi)型列表。 如果在 jdbcType 屬性中也同時(shí)指定,則注解方式將被忽略。

當(dāng)決定在 <ResultMap…/> 中使用某一TypeHandler時(shí),此時(shí)java類(lèi)型是已知的(從結(jié)果類(lèi)型中獲得),但是JDBC類(lèi)型是未知的。 因此Mybatis使用javaType=[TheJavaType], jdbcType=null的組合來(lái)選擇一個(gè)TypeHandler。 這意味著使用@MappedJdbcTypes注解可以限制TypeHandler的范圍,同時(shí)除非顯示的設(shè)置,否則TypeHandler在ResultMap中將是無(wú)效的。 如果希望在ResultMap中使用TypeHandler,那么設(shè)置@MappedJdbcTypes注解的includeNullJdbcType=true即可。 然而從Mybatis 3.4.0開(kāi)始,如果只有一個(gè)注冊(cè)的TypeHandler來(lái)處理Java類(lèi)型,那么它將是ResultMap使用Java類(lèi)型時(shí)的默認(rèn)值(即使沒(méi)有includeNullJdbcType=true)。

typeHandlers 屬性處理枚舉類(lèi)型

若想映射枚舉類(lèi)型 Enum,則需要從 org.apache.ibatis.type.EnumTypeHandler 或者 org.apache.ibatis.type.EnumOrdinalTypeHandler 中選一個(gè)來(lái)使用。比如說(shuō)我們想存儲(chǔ)取近似值時(shí)用到的舍入模式。默認(rèn)情況下,MyBatis 會(huì)利用 EnumTypeHandler 來(lái)把 Enum 值轉(zhuǎn)換成對(duì)應(yīng)的名字。

注意 EnumTypeHandler 在某種意義上來(lái)說(shuō)是比較特別的,其他的處理器只針對(duì)某個(gè)特定的類(lèi),而它不同,它會(huì)處理任意繼承了 Enum 的類(lèi)。

不過(guò),我們可能不想存儲(chǔ)名字,相反我們的 DBA 會(huì)堅(jiān)持使用整形值代碼。那也一樣輕而易舉: 在配置文件中把 EnumOrdinalTypeHandler 加到 typeHandlers 中即可, 這樣每個(gè) RoundingMode 將通過(guò)他們的序數(shù)值來(lái)映射成對(duì)應(yīng)的整形,配置示例:

<typeHandlers>

  <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/>

</typeHandlers>

自動(dòng)映射器(auto-mapper)會(huì)自動(dòng)地選用 EnumOrdinalTypeHandler 來(lái)處理, 所以如果我們想用普通的 EnumTypeHandler,就非要為那些 SQL 語(yǔ)句顯式地設(shè)置要用到的類(lèi)型處理器不可。

objectFactory(對(duì)象工廠(chǎng))

MyBatis 每次創(chuàng)建結(jié)果對(duì)象的新實(shí)例時(shí),它都會(huì)使用一個(gè)對(duì)象工廠(chǎng)(ObjectFactory)實(shí)例來(lái)完成。 默認(rèn)的對(duì)象工廠(chǎng)需要做的僅僅是實(shí)例化目標(biāo)類(lèi),要么通過(guò)默認(rèn)構(gòu)造方法,要么在參數(shù)映射存在的時(shí)候通過(guò)參數(shù)構(gòu)造方法來(lái)實(shí)例化。 如果想覆蓋對(duì)象工廠(chǎng)的默認(rèn)行為,則可以通過(guò)創(chuàng)建自己的對(duì)象工廠(chǎng)來(lái)實(shí)現(xiàn),示例代碼:

package org.mybatisExamples.simple;

  

import java.util.List;

import java.util.Properties;

  

import org.apache.ibatis.reflection.factory.DefaultObjectFactory;

  

@SuppressWarnings("serial")

public class ExampleObjectFactory extends DefaultObjectFactory {

  @Override

  public <T> T create(Class<T> type) {

    System.out.println("create is type=" + type.getName());

    return super.create(type);

  }

  

  @Override

  public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {

    System.out.println("create is type=" + type.getName());

    return super.create(type, constructorArgTypes, constructorArgs);

  }

  

  @Override

  public void setProperties(Properties properties) {

    System.out.println("setProperties is properties=" + properties.toString());

    super.setProperties(properties);

  }

}

配置文件:

<objectFactory type=" org.mybatisExamples.simple.ExampleObjectFactory ">

  <property name="someProperty" value="100"/>

</objectFactory>

插件(plugins)

MyBatis 允許你在已映射語(yǔ)句執(zhí)行過(guò)程中的某一點(diǎn)進(jìn)行攔截調(diào)用。默認(rèn)情況下,MyBatis 允許使用插件來(lái)攔截的方法調(diào)用包括:

Executor 接口的方法 update, query, flushStatements, commit, rollback, getTransaction, close, isClosed

ParameterHandler 接口的方法 getParameterObject, setParameters

ResultSetHandler 接口的方法 handleResultSets, handleOutputParameters

StatementHandler 接口的方法 prepare, parameterize, batch, update, query

這些類(lèi)中方法的細(xì)節(jié)可以通過(guò)查看每個(gè)方法的簽名來(lái)發(fā)現(xiàn),或者直接查看 MyBatis 的發(fā)行包中的源代碼。 假設(shè)你想做的不僅僅是監(jiān)控方法的調(diào)用,那么你應(yīng)該很好的了解正在重寫(xiě)的方法的行為。 因?yàn)槿绻谠噲D修改或重寫(xiě)已有方法的行為的時(shí)候,你很可能在破壞 MyBatis 的核心模塊。 這些都是更低層的類(lèi)和方法,所以使用插件的時(shí)候要特別當(dāng)心。通過(guò) MyBatis 提供的強(qiáng)大機(jī)制,使用插件是非常簡(jiǎn)單的,只需實(shí)現(xiàn) Interceptor 接口,并指定了想要攔截的方法簽名即可,示例代碼:

@Intercepts({@Signature(

// type:表示需要攔截的上面列出的接口

  type= Executor.class,

// method:表示攔截接口的方法

  method = "update",

// args:表示攔截方法的參數(shù)

  args = {MappedStatement.class,Object.class})})

public class ExamplePlugin implements Interceptor {

// 執(zhí)行攔截對(duì)象的方法 invocation.proceed 表示執(zhí)行原始方法

  public Object intercept(Invocation invocation) throws Throwable {

    return invocation.proceed();

  }

// 將目標(biāo)對(duì)象增加攔截器

  public Object plugin(Object target) {

    return Plugin.wrap(target, this);

  }

// 設(shè)置攔截器的屬性

  public void setProperties(Properties properties) {

  }

}

配置文件:

<plugins>

  <plugin interceptor="org.mybatis.example.ExamplePlugin">

    <property name="someProperty" value="100"/>

  </plugin>

</plugins>

配置環(huán)境(environments)

MyBatis 可以配置成適應(yīng)多種環(huán)境,這種機(jī)制有助于將 SQL 映射應(yīng)用于多種數(shù)據(jù)庫(kù)之中, 現(xiàn)實(shí)情況下有多種理由需要這么做。例如,開(kāi)發(fā)、測(cè)試和生產(chǎn)環(huán)境需要有不同的配置;或者共享相同 Schema 的多個(gè)生產(chǎn)數(shù)據(jù)庫(kù), 想使用相同的 SQL 映射。許多類(lèi)似的用例。

不過(guò)要記?。罕M管可以配置多個(gè)環(huán)境,每個(gè) SqlSessionFactory 實(shí)例只能選擇其一。

所以,如果你想連接兩個(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 實(shí)例

為了指定創(chuàng)建哪種環(huán)境,只要將它作為可選的參數(shù)傳遞給 SqlSessionFactoryBuilder 即可??梢越邮墉h(huán)境配置的兩個(gè)方法簽名是:

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment,properties);

如果忽略了環(huán)境參數(shù),那么默認(rèn)環(huán)境將會(huì)被加載,如下所示:

 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);

 SqlSessionFactory factory = new 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)鍵點(diǎn):

默認(rèn)的環(huán)境 ID(比如:default="development")。

每個(gè) environment 元素定義的環(huán)境 ID(比如:id="development")。

事務(wù)管理器的配置(比如:type="JDBC")。

數(shù)據(jù)源的配置(比如:type="POOLED")。

默認(rèn)的環(huán)境和環(huán)境 ID 是一目了然的。隨你怎么命名,只要保證默認(rèn)環(huán)境要匹配其中一個(gè)環(huán)境ID

事務(wù)管理器(transactionManager)

在 MyBatis 中有兩種類(lèi)型的事務(wù)管理器(也就是 type="[JDBC|MANAGED]"):

JDBC – 這個(gè)配置就是直接使用了 JDBC 的提交和回滾設(shè)置,它依賴(lài)于從數(shù)據(jù)源得到的連接來(lái)管理事務(wù)作用域。

MANAGED – 這個(gè)配置幾乎沒(méi)做什么。它從來(lái)不提交或回滾一個(gè)連接,而是讓容器來(lái)管理事務(wù)的整個(gè)生命周期(比如 JEE 應(yīng)用服務(wù)器的上下文)。 默認(rèn)情況下它會(huì)關(guān)閉連接,然而一些容器并不希望這樣,因此需要將 closeConnection 屬性設(shè)置為 false 來(lái)阻止它默認(rèn)的關(guān)閉行為。例如:

<transactionManager type="MANAGED">

  <property name="closeConnection" value="false"/>

</transactionManager>

這兩種事務(wù)管理器類(lèi)型都不需要任何屬性。它們不過(guò)是類(lèi)型別名,換句話(huà)說(shuō),你可以使用 TransactionFactory 接口的實(shí)現(xiàn)類(lèi)的完全限定名或類(lèi)型別名代替它們。

public interface TransactionFactory {

  void setProperties(Properties props);

  Transaction newTransaction(Connection conn);

  Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);

}

任何在 XML 中配置的屬性在實(shí)例化之后將會(huì)被傳遞給 setProperties() 方法。你也需要?jiǎng)?chuàng)建一個(gè) Transaction 接口的實(shí)現(xiàn)類(lèi),這個(gè)接口也很簡(jiǎn)單:

public interface Transaction {

  Connection getConnection() throws SQLException;

  void commit() throws SQLException;

  void rollback() throws SQLException;

  void close() throws SQLException;

  Integer getTimeout() throws SQLException;

}

使用這兩個(gè)接口,你可以完全自定義 MyBatis 對(duì)事務(wù)的處理。

數(shù)據(jù)源(dataSource)

dataSource 元素使用標(biāo)準(zhǔn)的 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|POOLED|JNDI]"):

UNPOOLED– 這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)只是每次被請(qǐng)求時(shí)打開(kāi)和關(guān)閉連接。雖然一點(diǎn)慢,它對(duì)在及時(shí)可用連接方面沒(méi)有性能要求的簡(jiǎn)單應(yīng)用程序是一個(gè)很好的選擇。 不同的數(shù)據(jù)庫(kù)在這方面表現(xiàn)也是不一樣的,所以對(duì)某些數(shù)據(jù)庫(kù)來(lái)說(shuō)使用連接池并不重要,這個(gè)配置也是理想的。UNPOOLED 類(lèi)型的數(shù)據(jù)源僅僅需要配置以下 5 種屬性:

driver – 這是 JDBC 驅(qū)動(dòng)的 Java 類(lèi)的完全限定名(并不是JDBC驅(qū)動(dòng)中可能包含的數(shù)據(jù)源類(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.",例如:

driver.encoding=UTF8

這將通過(guò)DriverManager.getConnection(url,driverProperties)方法傳遞值為 UTF8 的 encoding 屬性給數(shù)據(jù)庫(kù)驅(qū)動(dòng)。

POOLED– 這種數(shù)據(jù)源的實(shí)現(xiàn)利用"池"的概念將 JDBC 連接對(duì)象組織起來(lái),避免了創(chuàng)建新的連接實(shí)例時(shí)所必需的初始化和認(rèn)證時(shí)間。 這是一種使得并發(fā) Web 應(yīng)用快速響應(yīng)請(qǐng)求的流行處理方式。 除了上述提到 UNPOOLED 下的屬性外,會(huì)有更多屬性用來(lái)配置 POOLED 的數(shù)據(jù)源:

poolMaximumActiveConnections – 在任意時(shí)間可以存在的活動(dòng)(也就是正在使用)連接數(shù)量,默認(rèn)值:10

poolMaximumIdleConnections – 任意時(shí)間可能存在的空閑連接數(shù)。

poolMaximumCheckoutTime – 在被強(qiáng)制返回之前,池中連接被檢出(checked out)時(shí)間,默認(rèn)值:20000 毫秒(即 20 秒)

poolTimeToWait – 這是一個(gè)底層設(shè)置,如果獲取連接花費(fèi)的相當(dāng)長(zhǎng)的時(shí)間,它會(huì)給連接池打印狀態(tài)日志并重新嘗試獲取一個(gè)連接(避免在誤配置的情況下一直安靜的失?。J(rèn)值:20000 毫秒(即 20 秒)。

poolPingQuery – 發(fā)送到數(shù)據(jù)庫(kù)的偵測(cè)查詢(xún),用來(lái)檢驗(yàn)連接是否處在正常工作秩序中并準(zhǔn)備接受請(qǐng)求。默認(rèn)是"NO PING QUERY SET",這會(huì)導(dǎo)致多數(shù)數(shù)據(jù)庫(kù)驅(qū)動(dòng)失敗時(shí)帶有一個(gè)恰當(dāng)?shù)腻e(cuò)誤消息。

poolPingEnabled – 是否啟用偵測(cè)查詢(xún)。若開(kāi)啟,也必須使用一個(gè)可執(zhí)行的 SQL 語(yǔ)句設(shè)置 poolPingQuery 屬性(最好是一個(gè)非常快的 SQL),默認(rèn)值:false。

poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的使用頻度。這可以被設(shè)置成匹配具體的數(shù)據(jù)庫(kù)連接超時(shí)時(shí)間,來(lái)避免不必要的偵測(cè),默認(rèn)值:0(即所有連接每一時(shí)刻都被偵測(cè) — 當(dāng)然僅當(dāng) poolPingEnabled 為 true 時(shí)適用)。
通過(guò)需要實(shí)現(xiàn)接口 org.apache.ibatis.datasource.DataSourceFactory , 也可使用任何第三方數(shù)據(jù)源:

public interface DataSourceFactory {

  void setProperties(Properties props);

  DataSource getDataSource();

}

org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory 可被用作父類(lèi)來(lái)構(gòu)建新的數(shù)據(jù)源適配器,比如下面這段插入 C3P0 數(shù)據(jù)源所必需的代碼:

import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;

import com.mchange.v2.c3p0.ComboPooledDataSource;

         

public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {

  

  public C3P0DataSourceFactory() {

    this.dataSource = new ComboPooledDataSource();

  }

}

為了令其工作,為每個(gè)需要 MyBatis 調(diào)用的 setter 方法中增加一個(gè)屬性。下面是一個(gè)可以連接至 MySQL數(shù)據(jù)庫(kù)的例子:

<dataSource type="org.myproject.C3P0DataSourceFactory">

  <property name="driverClass" value="com.mysql.jdbc.driver"/>

  <property name="jdbcUrl" value="jdbc:mysql//localhost:3306/mydb"/>

  <property name="user" value="dev"/>

  <property name="password" value="liyong"/>

</dataSource>

映射器(mappers)

既然 MyBatis 的行為已經(jīng)由上述元素配置完了,我們現(xiàn)在就要定義 SQL 映射語(yǔ)句了。但是首先我們需要告訴 MyBatis 到哪里去找到這些語(yǔ)句。 Java 在自動(dòng)查找這方面沒(méi)有提供一個(gè)很好的方法,所以最佳的方式是告訴 MyBatis 到哪里去找映射文件。你可以使用相對(duì)于類(lèi)路徑的資源引用, 或完全限定資源定位符(包括 file:/// 的 URL),或類(lèi)名和包名等。例如:

<!-- Using classpath relative resources -->

<mappers>

  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>

  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>

  <mapper resource="org/mybatis/builder/PostMapper.xml"/>

</mappers>

<!-- Using url fully qualified paths -->

<mappers>

  <mapper url="file:///var/mappers/AuthorMapper.xml"/>

  <mapper url="file:///var/mappers/BlogMapper.xml"/>

  <mapper url="file:///var/mappers/PostMapper.xml"/>

</mappers>

<!-- Using mapper interface classes -->

<mappers>

  <mapper class="org.mybatis.builder.AuthorMapper"/>

  <mapper class="org.mybatis.builder.BlogMapper"/>

  <mapper class="org.mybatis.builder.PostMapper"/>

</mappers>

<!-- Register all interfaces in a package as mappers -->

<mappers>

  <package name="org.mybatis.builder"/>

</mappers>

以上這篇基于MyBatis XML配置方法(全面了解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)FTP文件與文件夾的上傳和下載

    Java實(shí)現(xiàn)FTP文件與文件夾的上傳和下載

    本文主要分享了Java實(shí)現(xiàn)文件上傳和下載的具體實(shí)例,分為單個(gè)文件的上傳與下載和整個(gè)文件夾的上傳與下載。具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧
    2016-12-12
  • Java中將字符串String轉(zhuǎn)換為整數(shù)int的多種方法

    Java中將字符串String轉(zhuǎn)換為整數(shù)int的多種方法

    在Java中將String類(lèi)型轉(zhuǎn)換為int類(lèi)型是一個(gè)常見(jiàn)的操作,下面這篇文章主要給大家介紹了關(guān)于Java中將字符串String轉(zhuǎn)換為整數(shù)int的多種方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • springboot如何通過(guò)不同的策略動(dòng)態(tài)調(diào)用不同的實(shí)現(xiàn)類(lèi)

    springboot如何通過(guò)不同的策略動(dòng)態(tài)調(diào)用不同的實(shí)現(xiàn)類(lèi)

    這篇文章主要介紹了springboot如何通過(guò)不同的策略動(dòng)態(tài)調(diào)用不同的實(shí)現(xiàn)類(lèi),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • springboot加載命令行參數(shù)ApplicationArguments的實(shí)現(xiàn)

    springboot加載命令行參數(shù)ApplicationArguments的實(shí)現(xiàn)

    本文主要介紹了springboot加載命令行參數(shù)ApplicationArguments的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 詳談java中File類(lèi)getPath()、getAbsolutePath()、getCanonical的區(qū)別

    詳談java中File類(lèi)getPath()、getAbsolutePath()、getCanonical的區(qū)別

    下面小編就為大家?guī)?lái)一篇詳談java中File類(lèi)getPath()、getAbsolutePath()、getCanonical的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • ANSI,Unicode,BMP,UTF等編碼概念實(shí)例講解

    ANSI,Unicode,BMP,UTF等編碼概念實(shí)例講解

    這篇文章主要介紹了ANSI,Unicode,BMP,UTF等編碼概念實(shí)例講解,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java并發(fā)框架中的AQS詳細(xì)解析

    Java并發(fā)框架中的AQS詳細(xì)解析

    這篇文章主要介紹了Java并發(fā)框架中的AQS詳細(xì)解析,之前說(shuō)鎖的升級(jí)的時(shí)候,說(shuō)到了自旋鎖會(huì)空轉(zhuǎn)幾次嘗試等待獲取資源,其實(shí)這一系列的動(dòng)作是有一個(gè)規(guī)范的這個(gè)規(guī)范叫做同步發(fā)生器AbstractQueuedSynchronizer ,簡(jiǎn)稱(chēng)AQS,需要的朋友可以參考下
    2024-01-01
  • JAVA HTTP反向代理實(shí)現(xiàn)過(guò)程詳解

    JAVA HTTP反向代理實(shí)現(xiàn)過(guò)程詳解

    這篇文章主要介紹了JAVA HTTP反向代理實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • java9開(kāi)始——接口中可以定義private私有方法

    java9開(kāi)始——接口中可以定義private私有方法

    這篇文章主要介紹了從java9開(kāi)始 接口中可以定義private私有方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-10-10
  • Java NIO工作原理的全面分析

    Java NIO工作原理的全面分析

    JDK 1.4 中引入的新輸入輸出 (NIO) 庫(kù)在標(biāo)準(zhǔn) Java 代碼中提供了高速的、面向塊的 I/O。本實(shí)用教程從高級(jí)概念到底層的編程細(xì)節(jié),非常詳細(xì)地介紹了 NIO 庫(kù)。您將學(xué)到諸如緩沖區(qū)和通道這樣的關(guān)鍵 I/O 元素的知識(shí),并考察更新后的庫(kù)中的標(biāo)準(zhǔn) I/O 是如何工作的。您還將了解只能通過(guò) NIO 來(lái)完成的工作,如異步 I/O 和直接緩沖區(qū)。
    2013-02-02

最新評(píng)論