1. 程式人生 > >[MyBatis原始碼分析系列] Environment

[MyBatis原始碼分析系列] Environment

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