2、配置(筆記)

結合springBoot
以及單獨使用mybatis來驗證一波 ,這幾個問題在後面都會進行講解,先看了文檔在說html

對象工廠
插件的使用
多環境配置 https://mybatis.org/mybatis-3...
事務處理器java

配置文件spring

configuration(配置)sql

  • properties(屬性)
  • settings(設置)
  • typeAliases(類型別名)
  • typeHandlers(類型處理器)
  • objectFactory(對象工廠)
  • plugins(插件)
  • environments(環境配置)
  • environment(環境變量)
  • transactionManager(事務管理器)
  • dataSource(數據源)
  • databaseIdProvider(數據庫廠商標識)
  • mappers(映射器)

1、properties(屬性)數據庫

一、這些屬性能夠在外部進行配置,並能夠進行動態替換。apache

你既能夠在典型的 Java 屬性文件中配置這些屬性,也能夠在 properties 元素的子元素中設置。例如:api

<properties resource="org/mybatis/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 將會由 properties 元素中設置的相應值來替換。

二、MyBatis 3.4.2 開始,你能夠爲佔位符指定一個默認值。服務器

<dataSource type="POOLED">
  <!-- ... -->
  <property name="username" value="${username:ut_user}"/> <!-- 若是屬性 'username' 沒有被配置,'username' 屬性的值將爲 'ut_user' -->
</dataSource>

這個特性默認是關閉的。要啓用這個特性,須要添加一個特定的屬性來開啓這個特性。例如:網絡

<properties resource="org/mybatis/example/config.properties">
  <!-- ... -->
  <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- 啓用默認值特性 -->
</properties>

三、 修改默認值的分隔符

<properties resource="org/mybatis/example/config.properties">
  <!-- ... -->
  <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/> <!-- 修改默認值的分隔符 -->
</properties>

結果

<dataSource type="POOLED">
  <!-- ... -->
  <property name="username" value="${db:username?:ut_user}"/>
</dataSource>

2、設置settings

<settings>
  <setting name="cacheEnabled" value="true"/>        #全局性地開啓或關閉全部映射器配置文件中已配置的任何緩存。默認true
  <setting name="lazyLoadingEnabled" value="true"/>    #延遲加載的全局開關特定關聯關係中可經過設置 fetchType 屬性來覆蓋該項的開關狀態。
  <setting name="multipleResultSetsEnabled" value="true"/> #是否容許單個語句返回多結果集(須要數據庫驅動支持)。
  <setting name="useColumnLabel" value="true"/>        #使用列標籤代替列名。實際表現依賴於數據庫驅動,具體可參考數據庫驅動的相關文檔,或經過對比測試來觀察。
  <setting name="useGeneratedKeys" value="false"/>  #容許 JDBC 支持自動生成主鍵,須要數據庫驅動支持。若是設置爲 true,將強制使用自動生成主鍵。儘管一些數據庫驅動不支持此特性,但仍可正常工做(如 Derby)
  <setting name="autoMappingBehavior" value="PARTIAL"/> #指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示關閉自動映射;PARTIAL 只會自動映射沒有定義嵌套結果映射的字段。 FULL 會自動映射任何複雜的結果集(不管是否嵌套)
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>  #指定發現自動映射目標未知列(或未知屬性類型)的行爲。 none 不作任何行爲(默認)Warning 輸出警告日誌 failing 映射失敗
  <setting name="defaultExecutorType" value="SIMPLE"/>  #配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(PreparedStatement); BATCH 執行器不只重用語句還會執行批量更新。
  <setting name="defaultStatementTimeout" value="25"/>    #設置超時時間,它決定數據庫驅動等待數據庫響應的秒數。
  <setting name="defaultFetchSize" value="100"/>        #爲驅動的結果集獲取數量(fetchSize)設置一個建議值。此參數只能夠在查詢設置中被覆蓋。
  <setting name="safeRowBoundsEnabled" value="false"/>    #是否容許在嵌套語句中使用分頁(RowBounds)。若是容許使用則設置爲 false。 默認false
  <setting name="mapUnderscoreToCamelCase" value="false"/>#是否開啓駝峯命名自動映射,即從經典數據庫列名 A_COLUMN 映射到經典 Java 屬性名 aColumn。
  <setting name="localCacheScope" value="SESSION"/>        #MyBatis 利用本地緩存機制(Local Cache)防止循環引用和加速重複的嵌套查詢。 默認值爲 SESSION,會緩存一個會話中執行的全部查詢。 若設置值爲 STATEMENT,本地緩存將僅用於執行語句,對相同 SqlSession 的不一樣查詢將不會進行緩存。
  <setting name="jdbcTypeForNull" value="OTHER"/>        #當沒有爲參數指定特定的 JDBC 類型時,空值的默認 JDBC 類型。 某些數據庫驅動須要指定列的 JDBC 類型,多數狀況直接用通常類型便可,好比 NULL、VARCHAR 或 OTHER。
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>#指定對象的哪些方法觸發一次延遲加載。
</settings>

3、類別名(typeAliases)
類型別名可爲 Java 類型設置一個縮寫名字。 它僅用於 XML 配置,意在下降冗餘的全限定類名書寫。例如:
<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、類型處理器
類型處理器將獲取到的值以合適的方式轉換成 Java 類型。下表描述了一些默認的類型處理器。

自定義類型處理器

// ExampleTypeHandler.java
@MappedJdbcTypes(JdbcType.VARCHAR)   #@MappedTypes註解指定與其關聯的 JDBC 類型列表。 若是在 jdbcType 屬性中也同時指定,則註解上的配置將被忽略。
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 直到語句被執行時才清楚數據類型。

在resulMap 映射關係中使用 jdbcType =XX 和javaType = XXX 來顯示的指定類型處理器,

配置mybatis來幫你查找類型處理器:注意在使用自動發現功能的時候,只能經過註解方式來指定 JDBC 的類型

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

5、對象工廠(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 方法。

6、插件(plugins)

除了用插件來修改 MyBatis 核心行爲之外,還能夠經過徹底覆蓋配置類來達到目的。只需繼承配置類後覆蓋其中的某個方法,再把它傳遞到 SqlSessionFactoryBuilder.build(myConfig) 方法便可。再次重申,這可能會極大影響 MyBatis 的行爲,務請慎之又慎

7、環境配置(environments)
環境配置(environments)

MyBatis 能夠配置成適應多種環境,這種機制有助於將 SQL 映射應用於多種數據庫之中, 現實狀況下有多種理由須要這麼作。例如,開發、測試和生產環境須要有不一樣的配置;或者想在具備相同 Schema 的多個生產數據庫中使用相同的 SQL 映射。還有許多相似的使用場景。

不過要記住:儘管能夠配置多個環境,但每一個 SqlSessionFactory 實例只能選擇一種環境。

因此,若是你想鏈接兩個數據庫,就須要建立兩個 SqlSessionFactory 實例,每一個數據庫對應一個。而若是是三個數據庫,就須要三個實例,依此類推,記起來很簡單:

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, 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")。

8、事務管理器(transactionManager)
在 MyBatis 中有兩種類型的事務管理器(也就是 type="[JDBC|MANAGED]"):

JDBC – 這個配置直接使用了 JDBC 的提交和回滾設施,它依賴從數據源得到的鏈接來管理事務做用域。
MANAGED – 這個配置幾乎沒作什麼。它從不提交或回滾一個鏈接,而是讓容器來管理事務的整個生命週期(好比 JEE 應用服務器的上下文)。 默認狀況下它會關閉鏈接。然而一些容器並不但願鏈接被關閉,所以須要將 closeConnection 屬性設置爲 false 來阻止默認的關閉行爲。例如:

<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
</transactionManager>

說明:spring中自帶了事務管理器來管理事務

一、事務管理器工廠頂層接口
public interface TransactionFactory {
  default void setProperties(Properties props) { // 從 3.5.2 開始,該方法爲默認方法
    // 空實現
  }
  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;
}

springBoot中手動事務 、開啓事務管理@EnableTransactionManagement

// 須要先注入以下兩個類
@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
TransactionDefinition transactionDefinition;

public void saveAll(){
    //開啓事務
    TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
    try{
        this.save();
        //提交事務
        dataSourceTransactionManager.commit(transactionStatus);
    }catch(Exception e){
        //回滾事務
        dataSourceTransactionManager.rollback(transactionStatus);
    }
}

9、數據源 (dataSource)
有三種內建的數據源類型(也就是 type="[UNPOOLED|POOLED|JNDI]"):

數據庫池
<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"/>
//<property name="defaultTransactionIsolationLevel " value="root"/> #鏈接的事務隔離級別
//<property name="driver.encoding" value="UTF8"/> #鏈接的事務隔離級別
//<property name="defaultNetworkTimeout " value="10"/> # 等待數據庫操做完成的默認網絡超時時間(單位:毫秒)

</dataSource>

10、數據庫廠商標識(databaseIdProvider)

設置了輸出庫廠商後,MyBatis 能夠根據不一樣的數據庫廠商執行不一樣的語句,具體是獲取了databaseId 後進行判斷
<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="DB2" value="db2"/>
  <property name="Oracle" value="oracle" />
</databaseIdProvider>

頂層接口

public interface DatabaseIdProvider {
  default void setProperties(Properties p) { // 從 3.5.2 開始,該方法爲默認方法
    // 空實現
  }
  String getDatabaseId(DataSource dataSource) throws SQLException;
}

11、映射器(mappers)

相關文章
相關標籤/搜索