properties
这些属性都是可外部配置且可动态替换的,既可以在典型的java属性文件中配置,也可以通过properties元素的子元素来传递。例如:
<properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <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文件中对应的值来替换。为配置提供了诸多灵活选择。
属性也可以被传递到SQLSessionFactoryBuilder.build()方法中。例如:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props); // ... or ... SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props); |
如果属性在不止一个地方进行了配置,那么MyBatis将按照下面的顺序来加载:
·在properties元素体内指定的属性首先被读取。
·然后根据properties元素中的resource属性读取类路径下属性文件或根据url属性指定的路径读取属性文件,并覆盖已读取的同名属性。
·最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件次之,最低优先级的是properties属性中指定的属性。
从MyBatis 3.4.2 开始,可以为占位符指定一个默认值。例如:
<dataSource type="POOLED"> <!-- ... --> <property name="username" value="${username:ut_user}"/> <!-- If 'username' property not present, username become 'ut_user' --> </dataSource> |
这个特性默认是关闭的。如果你想为占位符指定一个默认值,应该添加一个指定的属性来开启这个特性。例如:
<properties resource="org/mybatis/example/config.properties"> <!-- ... --> <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- Enable this feature --> </properties> |
提示,可以使用”:”作为属性键(eg. db:username)或者可以在sql定义中使用OGNL表达式的三元运算符(eg. ${tableName != null ? tableName : ‘global_constants’}),应该通过增加一个指定的属性来改变分隔键和默认值的字符。例如:
<properties resource="org/mybatis/example/config.properties"> <!-- ... --> <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/> <!-- Change default value of separator --> </properties> |
<dataSource type="POOLED"> <!-- ... --> <property name="username" value="${db:username?:ut_user}"/> </dataSource> |