MyBatis配置檔案總結

a_higher發表於2020-11-30

本文參考官網:https://mybatis.org/mybatis-3/zh/configuration.html

配置檔案結構如下

properties

這些屬性可以在外部進行配置,並可以進行動態替換。如配置資料來源的時候可以${xxx}

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

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

從 MyBatis 3.4.2 開始,你可以為佔位符指定一個預設值,如

${username:ut_user}<!-- 如果屬性 'username' 沒有被配置,'username' 屬性的值將為 'ut_user' -->

settings

會改變 MyBatis 的執行時行為,如:快取,懶載入,等等。完整如下

<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="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

typeAliases

為 Java 型別設定一個縮寫名字。意在降低冗餘的全限定類名書寫

typeHandlers

設定預處理語句(PreparedStatement)中的引數或從結果集中取出一個值時, 都會用型別處理器將獲取到的值以合適的方式轉換成 Java 型別。

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

objectFactory

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

plugins

攔截4大物件

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

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

// ExamplePlugin.java
@Intercepts({@Signature(
  type= Executor.class,
  method = "update",
  args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
  private Properties properties = new Properties();
  public Object intercept(Invocation invocation) throws Throwable {
    // implement pre processing if need
    Object returnObject = invocation.proceed();
    // implement post processing if need
    return returnObject;
  }
  public void setProperties(Properties properties) {
    this.properties = properties;
  }
}

environments

SqlSessionFactory 

每個資料庫對應一個 SqlSessionFactory 例項,如果你想連線兩個資料庫,就需要建立兩個 SqlSessionFactory 例項。為了指定建立哪種環境,只要將它作為可選的引數傳遞給 SqlSessionFactoryBuilder 即可。可以接受環境配置的兩個方法簽名是

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

事務管理器(transactionManager)

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

使用這Transaction 和TransactionFactory 介面,可以完全自定義 MyBatis 對事務的處理。

資料來源(dataSource)

  • UNPOOLED
  • POOLED
  • JNDI

資料庫廠商標識(databaseIdProvider)

可以通過實現介面 org.apache.ibatis.mapping.DatabaseIdProvider 並在 mybatis-config.xml 中註冊來構建自己的 DatabaseIdProvider:

對映器(mappers)

定義 SQL 對映語句。使用相對於類路徑的資源引用,或完全限定資源定位符(包括 file:/// 形式的 URL),或類名和包名等告訴 MyBatis 到哪裡去找對映檔案

相關文章