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> |