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指定。