属性(properties)

这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。例如:

  1. <properties resource="org/mybatis/example/config.properties">
  2. <property name="username" value="dev_user"/>
  3. <property name="password" value="F2Fa3!33TYyg"/>
  4. </properties>

然后其中的属性就可以在整个配置文件中被用来替换需要动态配置的属性值。比如:

  1. <dataSource type="POOLED">
  2. <property name="driver" value="${driver}"/>
  3. <property name="url" value="${url}"/>
  4. <property name="username" value="${username}"/>
  5. <property name="password" value="${password}"/>
  6. </dataSource>

这个例子中的 username 和 password 将会由 properties 元素中设置的相应值来替换。 driver 和 url 属性将会由 config.properties 文件中对应的值来替换。这样就为配置提供了诸多灵活选择。

属性也可以被传递到 SqlSessionFactoryBuilder.build()方法中。例如:

  1. SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props);
  2.  
  3. // ... 或者 ...
  4.  
  5. SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);

如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:

  • 在 properties 元素体内指定的属性首先被读取。
  • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
  • 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。

从 MyBatis 3.4.2 开始,你可以为占位符指定一个默认值。例如:

  1. <dataSource type="POOLED">
  2. <!-- ... -->
  3. <property name="username" value="${username:ut_user}"/> <!-- 如果属性 'username' 没有被配置,'username' 属性的值将为 'ut_user' -->
  4. </dataSource>

这个特性默认是关闭的。如果你想为占位符指定一个默认值, 你应该添加一个指定的属性来开启这个特性。例如:

<properties resource="org/mybatis/example/config.properties">
  <!-- ... -->
  <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- 启用默认值特性 -->
</properties>

提示 如果你已经使用 ":" 作为属性的键(如:db:username) ,或者你已经在 SQL 定义中使用 OGNL 表达式的三元运算符(如: ${tableName != null ? tableName : 'global_constants'}),你应该通过设置特定的属性来修改分隔键名和默认值的字符。例如:

<properties resource="org/mybatis/example/config.properties">
  <!-- ... -->
  <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/> <!-- 修改默认值的分隔符 -->
</properties>
<dataSource type="POOLED">
  <!-- ... -->
  <property name="username" value="${db:username?:ut_user}"/>
</dataSource>