MyBatis 可以配置多种环境,用于支持不同的数据库,例如:同时支持 Oracle 和 MySQL 数据库。也有可能是为了分别定义开发环境、测试环境和生产环境。
一个很重要的问题要记得:你可以配置多种环境(environment),但是每个 SqlSessionFactory 实例只能选择一个环境。
所以,如果你想连接两个数据库,你需要创建两个 SqlSessionFactory 实例,每个数据库对应一个数据库。如果你有三个数据库,你就需要创建三个 SqlSessionFactory 实例,以此类推。
为了明确创建哪种环境的 SqlSessionFactory,你可以将环境(environment)作为可选的参数传递给 SqlSessionFactoryBuilder。
SqlSessionFactoryBuilder 的 build() 方法可接受环境配置的两个方法签名如下:
// 接受环境 SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment); // 接受环境和属性 SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, properties);
如果环境被忽略,那么默认环境将会被加载,如下进行:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader); SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, properties);
要了解怎样配置环境,最直接的方式是查看 MyBatis 的 DTD 定义。如下:
<!ELEMENT environments (environment+)> <!ATTLIST environments default CDATA #REQUIRED > <!ELEMENT environment (transactionManager,dataSource)> <!ATTLIST environment id CDATA #REQUIRED > <!ELEMENT transactionManager (property*)> <!ATTLIST transactionManager type CDATA #REQUIRED > <!ELEMENT dataSource (property*)> <!ATTLIST dataSource type CDATA #REQUIRED >
上面的 DTD 定义中,允许 <environments> 标签下面添加一到多个 <environment>,而每一个 <environment> 表示一个环境,并且可以通过 default 属性定义默认的环境。其中:
transactionManager:用来定义事务管理器
dataSource:用来定义数据源
下面使用一个完整的示例演示同时配置两个环境(开发环境-development,正式环境-prod),且将开发环境设置为默认环境。配置如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="database.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> <!-- 正式环境 --> <environment id="prod"> <!-- 事务管理器配置 --> <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> <mappers> <mapper resource="com/hxstrive/mybatis/demo1/UserMapper.xml" /> </mappers> </configuration>
上面配置的关键点:
使用 <environments> 标签的 default 属性指定默认的环境 ID,比如:指定默认为环境为开发环境,default="development"
每个 <environment> 标签通过 ID 属性定义环境唯一 ID,如:id="development"
事务管理器的配置,如:type="JDBC"
数据源的配置,如:type="POOLED"
默认的环境和环境 ID 是自我解释的。你可以使用你喜欢的名称来命名,只要确定默认的要匹配其中之一。