mybatis源码解读(三)——数据源的配置

本文深入解析 MyBatis 的数据源配置,包括 environments 标签解析,数据源类图,三种数据源类型(UNPOOLED、POOLED、JNDI)的工作原理,以及如何初始化和使用数据源。重点讨论了连接池的概念,如 PooledDataSource 的实现原理,以及如何通过代理模式管理 Connection 对象。最后简要介绍了 JNDI 数据源的配置。
摘要由CSDN通过智能技术生成

目录

 


  在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值