欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[MyBatis源码分析系列] Environment

程序员文章站 2022-03-02 15:23:43
...

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

相关标签: MyBatis