[MyBatis原始碼分析系列] Environment
阿新 • • 發佈:2018-12-14
Environment
簡介
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);
注意這裡的關鍵點:
- 預設的環境 ID(比如:default=“development”)。
- 每個 environment 元素定義的環境 ID(比如:id=“development”)。
- 事務管理器的配置(比如:type=“JDBC”)。
- 資料來源的配置(比如:type=“POOLED”)。
預設的環境和環境 ID 是自解釋的,因此一目瞭然。你可以對環境隨意命名,但一定要保證預設的環境 ID 要匹配其中一個環境 ID。
文件連結:http://www.mybatis.org/mybatis-3/zh/configuration.html#environments
原始碼
很簡單對應了xml配製檔案environment下的三個元素
<environment id="development">
對應id<transactionManager type="JDBC">
對應TransactionFactory
<dataSource type="POOLED">
對應dataSource
另外程式碼中又用到了典型的構造者模式
public final class Environment {
private final String id;
private final TransactionFactory transactionFactory;
private final DataSource dataSource;
public Environment(String id, TransactionFactory transactionFactory, DataSource dataSource){
if (id == null) {
throw new IllegalArgumentException("Parameter 'id' must not be null");
}
if (transactionFactory == null){
throw new IllegalArgumentException("Parameter 'transactionFactory' must not be null");
}
this.id = id;
if (dataSource == null) {
throw new IllegalArgumentException("Parameter 'dataSource' must not be null");
}
this.transactionFactory = transactionFactory;
this.dataSource = dataSource;
}
public static class Builder {
private String id;
private TransactionFactory transactionFactory;
private DataSource dataSource;
public Builder(String id){
this.id = id;
}
public Builder transactionFactory(TransactionFactory transactionFactory) {
this.transactionFactory = transactionFactory;
return this;
}
public Builder dataSource(DataSource dataSource) {
this.dataSource = dataSource;
return this;
}
public String id() {
return this.id;
}
public Environment build() {
return new Environment(this.id, this.transactionFactory, this.dataSource);
}
public String getId() {
return this.id;
}
public TransactionFactory getTransactionFactory() {
return this.transactionFactory;
}
public DataSource getDataSource() {
return this.dataSource;
}
}