MyBatis 配置中,<properties> 标签用来引入一个属性文件或者定义多个属性,然后在配置文件中使用 ${} 方式进行引用。我们先看看标签 DTD 定义吧,如下:
<!ELEMENT properties (property*)> <!ATTLIST properties resource CDATA #IMPLIED url CDATA #IMPLIED > <!ELEMENT property EMPTY> <!ATTLIST property name CDATA #REQUIRED value CDATA #REQUIRED >
根据上面DTD定义得知,<properties> 拥有两个属性和一个 <property> 子标签。其中:
resource:从本地文件系统载入属性文件,如:resource="database.properties",将从项目 classpath 路径下面加载 database.properties 属性文件。
url:可以从互联网加载属性文件,如:url="http://www.hxstrive.com/data/database.properties" 将从网络位置下载属性文件。
<properties>标签是外部化的,可替代的属性,这些属性也可以配置在典型的 Java 属性配置文件中,或者通过 properties 元素的子元素来传递。例如:
<properties resource="org/mybatis/example/config.properties"> <property name="username" value="root"/> <property name="password" value="123456"/> </properties>
其中的属性就可以在整个配置文件中使用,使用可替换的属性来实现动态配置。比如:
<dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource>
这个例子中的 username 和 password 将会由 properties 元素中设置的值来替换。driver 和 url 属性将会从包含进来的 config.properties 文件中的值来替换。
属性也可以被传递到 SqlSessionBuilder.build() 方法中。例如:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props); // 或 SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, props);
如果在这些地方,属性多于一个的话,MyBatis 按照如下的顺序加载它们:
在 properties 元素体内指定的属性首先被读取。
从类路径下资源或 properties 元素的 url 属性中加载的属性第二被读取,它会覆盖已经存在的完全一样的属性。
作为方法参数传递的属性最后被读取,它也会覆盖任一已经存在的完全一样的属性,这些属性可能是从 properties 元素体内和资源/url 属性中加载的。
因此,最高优先级的属性是那些作为方法参数的,然后是资源/url 属性,最后是 properties 元素中指定的属性。