mybatis的官方文档已经给出了property加载顺序的说明,我来简单的验证一下:
(1)在mybatis-config.xml中配置如下:
<!-- 加载数据库配置文件 -->
<properties resource="jdbc.properties">
<property name="username" value="root"/>
</properties>
<!-- 数据库连接 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<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>
注意此时加载了一个jdbc.properties文件。
(2)jdbc.properties文件内容如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
password=XXX
注意此时在jdbc.properties文件中没有配置username属性。
(3)运行测试程序:
这个程序在http://blog.csdn.net/u012734723/article/details/77828903有说明
测试结果:
执行成功。
(4)在jdbc.properties中添加username属性:
username=aaa
程序不变,执行结果如下:
显示的是:用户名aaa不正确,拒绝aaa的登录。
说明在jdbc.properties中配置username属性的值覆盖了在mybatis-config.xml中的property的值。
(5)在SqlSessionFactoryBuilder().build()中引入另外一个properties,我这里命名为test.properties,内容如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
username=bbb
password=XXX
跟jdbc.properties不同的就是username属性的值。程序修改如下:
测试结果如下:
与(4)结果类似,只是这次被拒绝访问的不是aaa,而是bbb。说明test.properties文件中的username属性的值覆盖了之前所有的。
(6)提醒大家注意的是:如果不使用占位符,而是直接赋值,如下所示:
这里是不会去找任何地方相同属性名称的值的。
执行结果如下:
(7)总结:
a.当使用占位符给某个属性赋值时,这个属性会去找properties属性下是否有同名的子属性property。
b.接着去找在xml中引入的resource或url中相同名称的属性值。
c.最后,如果在创建SqlSessionFactory时,SqlSessionFactoryBuilder有引入新的文件,文件中含有相同的属性名称,则之前设定的值都会被覆盖。
文章写得很浅,希望大家不吝赐教。