1. 程式人生 > >Mybatis框架 --- 配置檔案

Mybatis框架 --- 配置檔案

Mybatis 配置檔案的設定和屬性資訊如下。 文件的頂層結構:

一、頂層結構

  • configuration 配置              
  1.  properties 屬性
  2.  settings 設定
  3.  typeAliases 類型別名
  4.  typeHandlers 型別處理器
  5.  objectFactory 物件工廠
  6.  plugins 外掛
  7.  environments  環境

          ① environment 環境變數

               (1)transactionManager 事務管理器

               (2)dataSource 資料來源

     8.   databaseIdProvider 資料庫廠商標識

     9.   mappers 對映器     

二、properties 標籤

        這些屬性可以通過外部配置且可動態替換,即可以在典型的java屬性檔案中配置,也可以通過properties元素的子元素來傳遞,例如:
<properties resource="db_config.properties">
  <property name="username" value="dev_user"/>
  <property name="password" value="F2Fa3!33TYyg"/>
</properties>

在外部的java屬性檔案

# 這是一個屬性配置檔案,配置了資料連線的引數
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mssdb
username=root
password=root

其中的屬性就可以在整個配置檔案中使用來替換需要動態配置的屬性值,例如在配置資料來源中,可以這樣使用

<dataSource type="POOLED">
  <property name="driver" value="${driver}"/>
  <property name="url" value="${url}"/>
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
</dataSource>

使用${屬性檔案的鍵值}來獲取屬性檔案的資料

注意:如果屬性不只在一個地方進行了配置,那麼Mybatis將按照下面的順序來載入:

  • 在properties 元素體內製定的屬性首先被讀取
  • 然後根據properties元素中的resource屬性讀取路徑下屬性檔案或根據url屬性制定的路徑讀取檔案,並覆蓋已讀取的同名屬性
  • 最後讀取作為方法引數傳遞的屬性,並覆蓋已讀取的同名屬性

因此, 通過方法引數傳遞的屬性具有最高優先順序, resource/url屬性中定製的配置檔案次之,最低優先順序的是properties屬性中指定的屬性

三、settings 標籤

        settings 是Mybatis中極為重要的調整設定,它們會改變Mybatis的執行時行為,具體標籤屬性如下:

設定引數描述有效值預設值
cacheEnabled該配置影響的所有對映器中配置的快取的全域性開關。true | falsetrue
lazyLoadingEnabled延遲載入的全域性開關。當開啟時,所有關聯物件都會延遲載入。 特定關聯關係中可通過設定fetchType屬性來覆蓋該項的開關狀態。true | falsefalse
aggressiveLazyLoading當啟用時,對任意延遲屬性的呼叫會使帶有延遲載入屬性的物件完整載入;反之,每種屬性將會按需載入。true | falsetrue
multipleResultSetsEnabled是否允許單一語句返回多結果集(需要相容驅動)。true | falsetrue
useColumnLabel使用列標籤代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文件或通過測試這兩種不同的模式來觀察所用驅動的結果。true | falsetrue
useGeneratedKeys允許 JDBC 支援自動生成主鍵,需要驅動相容。 如果設定為 true 則這個設定強制使用自動生成主鍵,儘管一些驅動不能相容但仍可正常工作(比如 Derby)。true | falseFalse
autoMappingBehavior指定 MyBatis 應如何自動對映列到欄位或屬性。 NONE 表示取消自動對映;PARTIAL 只會自動對映沒有定義巢狀結果集對映的結果集。 FULL 會自動對映任意複雜的結果集(無論是否巢狀)。NONE, PARTIAL, FULLPARTIAL
autoMappingUnknownColumnBehaviorSpecify the behavior when detects an unknown column (or unknown property type) of automatic mapping target.
  • NONE: Do nothing
  • WARNING: Output warning log (The log level of 'org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' must be set to WARN)
  • FAILING: Fail mapping (Throw SqlSessionException)
NONE, WARNING, FAILINGNONE
defaultExecutorType配置預設的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。SIMPLE REUSE BATCHSIMPLE
defaultStatementTimeout設定超時時間,它決定驅動等待資料庫響應的秒數。Any positive integerNot Set (null)
defaultFetchSizeSets the driver a hint as to control fetching size for return results. This parameter value can be override by a query setting.Any positive integerNot Set (null)
safeRowBoundsEnabled允許在巢狀語句中使用分頁(RowBounds)。 If allow, set the false.true | falseFalse
safeResultHandlerEnabled允許在巢狀語句中使用分頁(ResultHandler)。 If allow, set the false.true | falseTrue
mapUnderscoreToCamelCase是否開啟自動駝峰命名規則(camel case)對映,即從經典資料庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似對映。true | falseFalse
localCacheScopeMyBatis 利用本地快取機制(Local Cache)防止迴圈引用(circular references)和加速重複巢狀查詢。 預設值為 SESSION,這種情況下會快取一個會話中執行的所有查詢。 若設定值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享資料。SESSION | STATEMENTSESSION
jdbcTypeForNull當沒有為引數提供特定的 JDBC 型別時,為空值指定 JDBC 型別。 某些驅動需要指定列的 JDBC 型別,多數情況直接用一般型別即可,比如 NULL、VARCHAR 或 OTHER。JdbcType enumeration. Most common are: NULL, VARCHAR and OTHEROTHER
lazyLoadTriggerMethods指定哪個物件的方法觸發一次延遲載入。A method name list separated by commasequals,clone,hashCode,toString
defaultScriptingLanguage指定動態 SQL 生成的預設語言。A type alias or fully qualified class name.org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver
callSettersOnNulls指定當結果集中值為 null 的時候是否呼叫對映物件的 setter(map 物件時為 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本型別(int、boolean等)是不能設定成 null 的。true | falsefalse
logPrefix指定 MyBatis 增加到日誌名稱的字首。Any StringNot set
logImpl指定 MyBatis 所用日誌的具體實現,未指定時將自動查詢。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGINGNot set
proxyFactory指定 Mybatis 建立具有延遲載入能力的物件所用到的代理工具。CGLIB | JAVASSISTJAVASSIST (MyBatis 3.3 or above)
vfsImplSpecifies VFS implementationsFully qualified class names of custom VFS implementation separated by commas.Not set
useActualParamNameAllow referencing statement parameters by their actual names declared in the method signature. To use this feature, your project must be compiled in Java 8 with -parameters option. (Since: 3.4.1) 

四、typeAliases 標籤

        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>

        當進行這樣的配置時候,Blog可以用在任何使用domain.blog.Blog的地方

        也可以指定一個包名, Mybatis會在包名下搜尋需要的 Java Bean 如:

<typeAliases>
  <package name="domain.blog"/>
</typeAliases>
        

五、 typeHandlers 標籤

        無論是 MyBatis 在預處理語句(PreparedStatement)中設定一個引數時,還是從結果集中取出一個值時, 都會用型別處理器將獲取的值以合適的方式轉換成 Java 型別。下表描述了一些預設的型別處理器。

型別處理器Java 型別JDBC 型別
BooleanTypeHandlerjava.lang.Boolean, boolean資料庫相容的 BOOLEAN
ByteTypeHandlerjava.lang.Byte, byte資料庫相容的 NUMERICBYTE
ShortTypeHandlerjava.lang.Short, short資料庫相容的 NUMERICSHORT INTEGER
IntegerTypeHandlerjava.lang.Integer, int資料庫相容的 NUMERICINTEGER
LongTypeHandlerjava.lang.Long, long資料庫相容的 NUMERICLONG INTEGER
FloatTypeHandlerjava.lang.Float, float資料庫相容的 NUMERICFLOAT
DoubleTypeHandlerjava.lang.Double, double資料庫相容的 NUMERICDOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal資料庫相容的 NUMERICDECIMAL
StringTypeHandlerjava.lang.StringCHAR, VARCHAR
ClobReaderTypeHandlerjava.io.Reader-
ClobTypeHandlerjava.lang.StringCLOB, LONGVARCHAR
NStringTypeHandlerjava.lang.StringNVARCHAR, NCHAR
NClobTypeHandlerjava.lang.StringNCLOB
BlobInputStreamTypeHandlerjava.io.InputStream-
ByteArrayTypeHandlerbyte[]資料庫相容的位元組流型別
BlobTypeHandlerbyte[]BLOB, LONGVARBINARY
DateTypeHandlerjava.util.DateTIMESTAMP
DateOnlyTypeHandlerjava.util.DateDATE
TimeOnlyTypeHandlerjava.util.DateTIME
SqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMP
SqlDateTypeHandlerjava.sql.DateDATE
SqlTimeTypeHandlerjava.sql.TimeTIME
ObjectTypeHandlerAnyOTHER 或未指定型別
EnumTypeHandlerEnumeration TypeVARCHAR-任何相容的字串型別,儲存列舉的名稱(而不是索引)
EnumOrdinalTypeHandlerEnumeration Type任何相容的 NUMERICDOUBLE 型別,儲存列舉的索引(而不是名稱)。
InstantTypeHandlerjava.time.InstantTIMESTAMP
LocalDateTimeTypeHandlerjava.time.LocalDateTimeTIMESTAMP
LocalDateTypeHandlerjava.time.LocalDateDATE
LocalTimeTypeHandlerjava.time.LocalTimeTIME
OffsetDateTimeTypeHandlerjava.time.OffsetDateTimeTIMESTAMP
OffsetTimeTypeHandlerjava.time.OffsetTimeTIME
ZonedDateTimeTypeHandlerjava.time.ZonedDateTimeTIMESTAMP
YearTypeHandlerjava.time.YearINTEGER
MonthTypeHandlerjava.time.MonthINTEGER
YearMonthTypeHandlerjava.time.YearMonthVARCHAR or LONGVARCHAR
JapaneseDateTypeHandlerjava.time.chrono.JapaneseDateDATE

你可以重寫型別處理器或建立你自己的型別處理器來處理不支援的或非標準的型別。 具體做法為:實現 org.apache.ibatis.type.TypeHandler 介面, 或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandler, 然後可以選擇性地將它對映到一個 JDBC 型別。比如:

// ExampleTypeHandler.java
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
    ps.setString(i, parameter);
  }

  @Override
  public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
    return rs.getString(columnName);
  }

  @Override
  public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    return rs.getString(columnIndex);
  }

  @Override
  public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return cs.getString(columnIndex);
  }
}
<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>

使用這個的型別處理器將會覆蓋已經存在的處理 Java 的 String 型別屬性和 VARCHAR 引數及結果的型別處理器。 要注意 MyBatis 不會窺探資料庫元資訊來決定使用哪種型別,所以你必須在引數和結果對映中指明那是 VARCHAR 型別的欄位, 以使其能夠繫結到正確的型別處理器上。 這是因為:MyBatis 直到語句被執行才清楚資料型別。

通過型別處理器的泛型,MyBatis 可以得知該型別處理器處理的 Java 型別,不過這種行為可以通過兩種方法改變:

  • 在型別處理器的配置元素(typeHandler element)上增加一個 javaType 屬性(比如:javaType="String");
  • 在型別處理器的類上(TypeHandler class)增加一個 @MappedTypes 註解來指定與其關聯的 Java 型別列表。 如果在 javaType 屬性中也同時指定,則註解方式將被忽略。

可以通過兩種方式來指定被關聯的 JDBC 型別:

  • 在型別處理器的配置元素上增加一個 jdbcType 屬性(比如:jdbcType="VARCHAR");
  • 在型別處理器的類上(TypeHandler class)增加一個 @MappedJdbcTypes 註解來指定與其關聯的 JDBC 型別列表。 如果在 jdbcType 屬性中也同時指定,則註解方式將被忽略。

當決定在ResultMap中使用某一TypeHandler時,此時java型別是已知的(從結果型別中獲得),但是JDBC型別是未知的。 因此Mybatis使用javaType=[TheJavaType], jdbcType=null的組合來選擇一個TypeHandler。 這意味著使用@MappedJdbcTypes註解可以限制TypeHandler的範圍,同時除非顯式的設定,否則TypeHandler在ResultMap中將是無效的。 如果希望在ResultMap中使用TypeHandler,那麼設定@MappedJdbcTypes註解的includeNullJdbcType=true即可。 然而從Mybatis 3.4.0開始,如果只有一個註冊的TypeHandler來處理Java型別,那麼它將是ResultMap使用Java型別時的預設值(即使沒有includeNullJdbcType=true)。

最後,可以讓 MyBatis 為你查詢型別處理器:

<!-- mybatis-config.xml -->
<typeHandlers>
  <package name="org.mybatis.example"/>
</typeHandlers>

六、 物件工廠標籤 ObjectFactory

MyBatis 每次建立結果物件的新例項時,它都會使用一個物件工廠(ObjectFactory)例項來完成。 預設的物件工廠需要做的僅僅是例項化目標類,要麼通過預設構造方法,要麼在引數對映存在的時候通過引數構造方法來例項化。 如果想覆蓋物件工廠的預設行為,則可以通過建立自己的物件工廠來實現。比如:

// 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);
  }
  public <T> boolean isCollection(Class<T> type) {
    return Collection.class.isAssignableFrom(type);
  }}
<!-- mybatis-config.xml -->
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
  <property name="someProperty" value="100"/>
</objectFactory>

ObjectFactory 介面很簡單,它包含兩個建立用的方法,一個是處理預設構造方法的,另外一個是處理帶引數的構造方法的。 最後,setProperties 方法可以被用來配置 ObjectFactory,在初始化你的 ObjectFactory 例項後, objectFactory 元素體中定義的屬性會被傳遞給 setProperties 方法。


七、 plugins 標籤  外掛

MyBatis 允許你在已對映語句執行過程中的某一點進行攔截呼叫。預設情況下,MyBatis 允許使用外掛來攔截的方法呼叫包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

這些類中方法的細節可以通過檢視每個方法的簽名來發現,或者直接檢視 MyBatis 發行包中的原始碼。 如果你想做的不僅僅是監控方法的呼叫,那麼你最好相當瞭解要重寫的方法的行為。 因為如果在試圖修改或重寫已有方法的行為的時候,你很可能在破壞 MyBatis 的核心模組。 這些都是更低層的類和方法,所以使用外掛的時候要特別當心。

通過 MyBatis 提供的強大機制,使用外掛是非常簡單的,只需實現 Interceptor 介面,並指定想要攔截的方法簽名即可。

// 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) {
  }
}
<!-- mybatis-config.xml -->
<plugins>
  <plugin interceptor="org.mybatis.example.ExamplePlugin">
    <property name="someProperty" value="100"/>
  </plugin>
</plugins>

上面的外掛將會攔截在 Executor 例項中所有的 “update” 方法呼叫, 這裡的 Executor 是負責執行低層對映語句的內部物件。

提示: 覆蓋配置類

除了用外掛來修改 MyBatis 核心行為之外,還可以通過完全覆蓋配置類來達到目的。只需繼承後覆蓋其中的每個方法,再把它傳遞到 SqlSessionFactoryBuilder.build(myConfig) 方法即可。再次重申,這可能會嚴重影響 MyBatis 的行為,務請慎之又慎。


八、 environments 配置環境標籤

    MyBatis 可以配置成適應多種環境,這種機制有助於將 SQL 對映應用於多種資料庫之中, 現實情況下有多種理由需要這麼做。例如,開發、測試和生產環境需要有不同的配置;或者共享相同 Schema 的多個生產資料庫, 想使用相同的 SQL 對映。許多類似的用例。

    不過要記住:儘管可以配置多個環境,每個 SqlSessionFactory 例項只能選擇其一。

    所以,如果你想連線兩個資料庫,就需要建立兩個 SqlSessionFactory 例項,每個資料庫對應一個。而如果是三個資料庫,就需要三個例項,依此類推,記起來很簡單:

  • 每個資料庫對應一個 SqlSessionFactory 例項

    為了指定建立哪種環境,只要將它作為可選的引數傳遞給 SqlSessionFactoryBuilder 即可。可以接受環境配置的兩個方法簽名是: 

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

    如果忽略了環境引數,那麼預設環境將會被載入,如下所示: 

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
    環境元素定義瞭如何配置環境。
<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>

注意這裡的關鍵點:

  • 預設的環境 ID(比如:default="development")。
  • 每個 environment 元素定義的環境 ID(比如:id="development")。
  • 事務管理器的配置(比如:type="JDBC")。
  • 資料來源的配置(比如:type="POOLED")。

預設的環境和環境 ID 是自解釋的,因此一目瞭然。你可以對環境隨意命名,但一定要保證預設的環境 ID 要匹配其中一個環境 ID。

九、 transactionManager 事務管理器

在 MyBatis 中有兩種型別的事務管理器(也就是 type=”[JDBC|MANAGED]”):

  • JDBC – 這個配置就是直接使用了 JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務作用域。
  • MANAGED – 這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為。例如:
<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
</transactionManager>

    如果你正在使用 Spring + MyBatis,則沒有必要配置事務管理器, 因為 Spring 模組會使用自帶的管理器來覆蓋前面的配置。

這兩種事務管理器型別都不需要任何屬性。它們不過是類型別名,換句話說,你可以使用 TransactionFactory 介面的實現類的完全限定名或類型別名代替它們。 

public interface TransactionFactory {
  void setProperties(Properties props);  
  Transaction newTransaction(Connection conn);
  Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);  
}

任何在 XML 中配置的屬性在例項化之後將會被傳遞給 setProperties() 方法。你也需要建立一個 Transaction 介面的實現類,這個介面也很簡單:

public interface Transaction {
  Connection getConnection() throws SQLException;
  void commit() throws SQLException;
  void rollback() throws SQLException;
  void close() throws SQLException;
  Integer getTimeout() throws SQLException;
}

使用這兩個介面,你可以完全自定義 MyBatis 對事務的處理。

十、 dataSource 資料來源

dataSource 元素使用標準的 JDBC 資料來源介面來配置 JDBC 連線物件的資源。

  • 許多 MyBatis 的應用程式會按示例中的例子來配置資料來源。雖然這是可選的,但為了使用延遲載入,資料來源是必須配置的。

有三種內建的資料來源型別(也就是 type=”[UNPOOLED|POOLED|JNDI]”):

UNPOOLED– 這個資料來源的實現只是每次被請求時開啟和關閉連線。雖然有點慢,但對於在資料庫連線可用性方面沒有太高要求的簡單應用程式來說,是一個很好的選擇。 不同的資料庫在效能方面的表現也是不一樣的,對於某些資料庫來說,使用連線池並不重要,這個配置就很適合這種情形。UNPOOLED 型別的資料來源僅僅需要配置以下 5 種屬性:

  • driver – 這是 JDBC 驅動的 Java 類的完全限定名(並不是 JDBC 驅動中可能包含的資料來源類)。
  • url – 這是資料庫的 JDBC URL 地址。
  • username – 登入資料庫的使用者名稱。
  • password – 登入資料庫的密碼。
  • defaultTransactionIsolationLevel – 預設的連線事務隔離級別。

作為可選項,你也可以傳遞屬性給資料庫驅動。要這樣做,屬性的字首為“driver.”,例如:

  • driver.encoding=UTF8

這將通過 DriverManager.getConnection(url,driverProperties) 方法傳遞值為 UTF8encoding 屬性給資料庫驅動。

POOLED– 這種資料來源的實現利用“池”的概念將 JDBC 連線物件組織起來,避免了建立新的連線例項時所必需的初始化和認證時間。 這是一種使得併發 Web 應用快速響應請求的流行處理方式。

除了上述提到 UNPOOLED 下的屬性外,還有更多屬性用來配置 POOLED 的資料來源:

  • poolMaximumActiveConnections – 在任意時間可以存在的活動(也就是正在使用)連線數量,預設值:10
  • poolMaximumIdleConnections – 任意時間可能存在的空閒連線數。
  • poolMaximumCheckoutTime – 在被強制返回之前,池中連線被檢出(checked out)時間,預設值:20000 毫秒(即 20 秒)
  • poolTimeToWait – 這是一個底層設定,如果獲取連線花費了相當長的時間,連線池會列印狀態日誌並重新嘗試獲取一個連線(避免在誤配置的情況下一直安靜的失敗),預設值:20000 毫秒(即 20 秒)。
  • poolMaximumLocalBadConnectionTolerance – 這是一個關於壞連線容忍度的底層設定, 作用於每一個嘗試從快取池獲取連線的執行緒. 如果這個執行緒獲取到的是一個壞的連線,那麼這個資料來源允許這個執行緒嘗試重新獲取一個新的連線,但是這個重新嘗試的次數不應該超過 poolMaximumIdleConnectionspoolMaximumLocalBadConnectionTolerance 之和。 預設值:3 (新增於 3.4.5)
  • poolPingQuery – 傳送到資料庫的偵測查詢,用來檢驗連線是否正常工作並準備接受請求。預設是“NO PING QUERY SET”,這會導致多數資料庫驅動失敗時帶有一個恰當的錯誤訊息。
  • poolPingEnabled – 是否啟用偵測查詢。若開啟,需要設定 poolPingQuery 屬性為一個可執行的 SQL 語句(最好是一個速度非常快的 SQL 語句),預設值:false。
  • poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的頻率。可以被設定為和資料庫連線超時時間一樣,來避免不必要的偵測,預設值:0(即所有連線每一時刻都被偵測 — 當然僅當 poolPingEnabled 為 true 時適用)。

JNDI – 這個資料來源的實現是為了能在如 EJB 或應用伺服器這類容器中使用,容器可以集中或在外部配置資料來源,然後放置一個 JNDI 上下文的引用。這種資料來源配置只需要兩個屬性:

  • initial_context – 這個屬性用來在 InitialContext 中尋找上下文(即,initialContext.lookup(initial_context))。這是個可選屬性,如果忽略,那麼 data_source 屬性將會直接從 InitialContext 中尋找。
  • data_source – 這是引用資料來源例項位置的上下文的路徑。提供了 initial_context 配置時會在其返回的上下文中進行查詢,沒有提供時則直接在 InitialContext 中查詢。

和其他資料來源配置類似,可以通過新增字首“env.”直接把屬性傳遞給初始上下文。比如:

  • env.encoding=UTF8

這就會在初始上下文(InitialContext)例項化時往它的構造方法傳遞值為 UTF8encoding 屬性。

<dataSource type="org.myproject.C3P0DataSourceFactory">
  <property name="driver" value="org.postgresql.Driver"/>
  <property name="url" value="jdbc:postgresql:mydb"/>
  <property name="username" value="postgres"/>
  <property name="password" value="root"/>
</dataSource>

十一、 Mappers 對映器

既然 MyBatis 的行為已經由上述元素配置完了,我們現在就要定義 SQL 對映語句了。但是首先我們需要告訴 MyBatis 到哪裡去找到這些語句。 Java 在自動查詢這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪裡去找對映檔案。你可以使用相對於類路徑的資源引用, 或完全限定資源定位符(包括 file:/// 的 URL),或類名和包名等。例如:


<!-- 使用相對於類路徑的資源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers><!-- 使用完全限定資源定位符(URL) -->

<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers><!-- 使用對映器介面實現類的完全限定類名 -->

<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers><!-- 將包內的對映器介面實現全部註冊為對映器 -->

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

這些配置會告訴了 MyBatis 去哪裡找對映檔案,剩下的細節就應該是每個 SQL 對映檔案了,也就是接下來我們要討論的。

源自: mybatis官方開發文件