MyBatis源码分析-环境搭建及数据源配置解析顺序

1.搭建maven工程,引入以下mybatis和mysql数据的jar包

 <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>
</dependencies>

2、配置数据库属性,填写数据库连接信息


3、创建实体类User和对应的Mapper接口
 

 4、配置映射文件User.xml

 5、配置mybatis的配置文件SqlMapConfig.xml,我们先只配些简单的属性,保证程序可以执行

<?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="jdbc.properties" />
    
    <environments default="development">
        <environment id="development">
            <!--type="JDBC" 代表使用JDBC的提交和回滚来管理事务-->
            <transactionManager type="JDBC" />
            <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
            <!-- POOLED 表示支持JDBC数据源连接池 -->
            <!-- UNPOOLED 表示不支持数据源连接池 -->
            <!-- JNDI 表示支持外部数据源连接池 -->
            <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>

    <mappers>
        <mapper resource="User.xml"></mapper>
    </mappers>

</configuration>

6、编写测试代码

上面我们已经把环境搭建成功,并且可以运行查询结果了,下面我们开始对一些属性做些介绍。

数据源配置,我们用的是resource指定文件名,其实还可以用url或者在properties内部写多个property,然后指定对应属性的值,也可以直接在environments的dataSource里的property直接指定。我们把几种方式分别都写下。

①用resource指定


②用url方式:

 可以看出和resource的区别是,url用的是绝对路径,并且在前面加了file:///
file:///表示啥意思?本地文件传输协议,File协议主要用于访问本地计算机中的文件,就如同在Windows资源管理器中打开文件一样。
③在properties内部写多个property

④environments的dataSource里的property直接指定

 那如果我们即用了resource或者url指定,又在在properties内部写多个property,以哪为准呢?我们可以试下,

 可以看出依然可以查询出结果,说明会以resource或者url指定的值为准。

那如果我们同时用resource和url都指定呢?

执行结果发现报错
 我们找到源码所在的位置,XMLConfigBuilder的propertiesElement方法,可以看到是在parseConfiguration方法里调的propertiesElement方法

 我们看下源码解析过程

private void propertiesElement(XNode context) throws Exception {
    if (context != null) {
      //默认先取properties节点下的property的值
      Properties defaults = context.getChildrenAsProperties();
      String resource = context.getStringAttribute("resource");
      String url = context.getStringAttribute("url");
      //先判断是不是resource和url的值是不是都不为空,都不为空则抛出异常
      if (resource != null && url != null) {
        throw new BuilderException("The properties element cannot specify both a URL and a resource based property file reference.  Please specify one or the other.");
      }
      //接下来判断resource的值,再判断url的值,如果不为空则去覆盖properties节点下的property的值
      if (resource != null) {
        defaults.putAll(Resources.getResourceAsProperties(resource));
      } else if (url != null) {
        defaults.putAll(Resources.getUrlAsProperties(url));
      }
      Properties vars = configuration.getVariables();
      if (vars != null) {
        defaults.putAll(vars);
      }
      parser.setVariables(defaults);
      configuration.setVariables(defaults);
    }
  }

 可以看出properties节点下的property里的值可以对resource或者url指定的属性进行补充,如果有些属性在resource或者url指定的文件里没写,我们可以在properties节点下的property里写。例如我们在jdbc.properties文件里不指定密码或者是个空文件,然后在properties节点下的property里的指定相关属性

 
执行成功

我们总结一下获取properties的属性里的值的先后顺序。
先取properties节点下的property的值--》resource指定的文件里有相同的属性时进行覆盖--》resources为空,则url指定的文件里有相同的属性时进行覆盖,一般建议用resource指定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值