目录
- 1、解析 environments 标签
- 2、mybatis 的数据源类图
- 3、mybatis 三种数据源类型
- 4、mybatis 初始化数据源
- 5、不使用连接池 UnpooledDataSource
- 6、数据库连接池
- 7、使用连接池 PooledDataSource
- 8、JNDI类型的数据源 JndiDataSource
在mybatis-configuration.xml 文件中,我们进行了如下的配置:
<!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境常用: 一、development:开发模式 二、work:工作模式 -->
<environments default="development">
<!--id属性必须和上面的default一样 -->
<environment id="development">
<!--使用JDBC的事务管理机制-->
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
其中 <transactionManager type="JDBC" /> 是对事务的配置,下篇博客我们会详细介绍。
本篇博客我们介绍 <dataSource type="POOLED"> 对于数据源的配置。
1、解析 environments 标签
在 XMLConfigBuilder.java 的 parseConfiguration(XNode root) 中:
进入 environmentsElement(root.evalNode("environments")) 方法:
1 private void environmentsElement(XNode context) throws Exception {
2 //如果<environments>标签不为null
3 if (context != null) {
4 //如果 environment 值为 null
5 if (environment == null) {
6 //获取<environments default="属性值">中的default属性值
7 environment = context.getStringAttribute("default");
8 }
9 //遍历<environments />标签中的子标签<environment />
10 for (XNode child : context.getChildren()) {
11 //获取<environment id="属性值">中的id属性值
12 String id = child.getStringAttribute("id");
13 //遍历所有<environment>的时候一次判断相应的id是否是default设置的值
14 if (isSpecifiedEnvironment(id)) {
15 //获取配置的事务管理器
16 TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));
17 //获取配置的数据源信息
18 DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource"));
19 DataSource dataSource = dsFactory.getDataSource();
20 Environment.Builder environmentBuilder = new Environment.Builder(id)
21 .transactionFactory(txFactory)
22 .dataSource(dataSource);
23 configuration.setEnvironment(environmentBuilder.build());
24 }
25 }
26 }
27 }
28
29 private boolean isSpecifiedEnvironment(String id) {
30 if (environment == null) {
31 throw new BuilderException("No environment specified.");
32 } else if (id == null) {
33 throw new BuilderException("Environment requires an id attribute.");
34 } else if (environment.equals(id)) {
35 return true;
36 }
37 return false;
38 }
①、第 3 行代码:if (context != null) 也就是说我们可以不在 mybatis-configuration.xml 文件中配置<environments />标签,这是为了和spring整合时,在spring容器中进行配置。
②、第 5 行——第 8 行代码:获取<environments default="属性值">中的default属性值,注意第 5 行 首先判断 environment == null 。因为我们可以配置多个环境,也就是连接多个数据库。
不过需要记住:尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一,也就是说每个数据库对应一个 SqlSessionFactory 实例。
可以用如下方法进行区别:
1 SqlSessionFactory fac