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

猜你喜欢

转载自blog.csdn.net/weixin_36210698/article/details/83501079