2011-12-05 98 views
6

首先是問題:我使用XML定義的查詢,並且SQL包含數據庫名稱作爲表名稱的一部分。例如:SELECT * from mydb.bar。不幸的是,數據庫被創建/命名到處都是,並且mudb部分確實是動態的,並且可以在任何時候改變。所以,我想用一個屬性來替代它,所以它看起來像SELECT * FROM ${dbname}.bar,然後我定義中的MyBatis-config.xml中的以下部分:MyBatis - 定義全局參數

<properties> 
    <property name="dbname" value="mydb"/> 
</properties> 

但是當我運行查詢${dbname}值爲空。如果我在屬性文件中定義此屬性,也會發生同樣的情況我不願意將它作爲每個調用參數的一部分傳遞,因爲這是一個真正的全局屬性。這可以做到嗎?如果是 - 如何?

回答

4

是的,你可以!這可能是一種奇怪的未記錄功能。在構建你的配置對象時,做一些這樣的事情。 (org.apache.ibatis.session.Configuration)

configuration.getVariables().put("global_param", "123"); 

然後在你的XML映射中,你可以參考。

select * from ${global_param} 
+1

謝謝!不幸的是,我使用Spring來抽象MyBatis,我的所有配置都是在applicationContext.xml中定義的。我想知道,如果這些變量是公開的,並且可以通過applicationContext.xml中的XML配置來設置,那麼看看這個 – Bostone

+0

它看起來應該可以工作。我查看了SqlSessionFactoryBean的源代碼,它似乎將變量設置爲屬性。我沒有與Spring集成一起工作,但我想嘗試調試SqlSessionFactoryBean中的buildSqlSessionFactory方法,以查看它加載屬性的位置。 – Andy

+0

傳遞給'SqlSessionFactoryBean.setConfigurationProperties()'的屬性在MyBatis配置中被設置爲變量。您應該能夠在Spring xml中創建一個屬性,並在配置工廠bean時使用它。 – AngerClown

3

我不得不使用Spring + MyBatis中同樣的問題,並通過設置 'configurationProperties' 使用的SqlSessionFactory我的Spring XML定義解決了這個問題。我下面的例子展示瞭如何設置一個名爲'encryptionKey'的定製全局屬性,該屬性的值可以在XML文件中進行硬編碼,也可以使用context:property-placeholder標記(如下所示)從外部文件加載。

<context:property-placeholder location="/WEB-INF/spring/config-datasource.properties" /> 

<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <beans:property name="dataSource" ref="dataSource" /> 
    <beans:property name="typeAliasesPackage" value="com.example.model" /> 
    <beans:property name="configurationProperties"> 
     <beans:props> 
      <beans:prop key="encryptionKey">${jdbc.encryptionKey}</beans:prop> 
     </beans:props> 
    </beans:property> 
</beans:bean> 
0

我使用XML配置而不是春,設置配置對象的內部屬性,但發現已經被加載的映射文件之前進行(見here)。我放棄了配置對象的方法,用這種方法,這爲我工作去了:

Reader reader = Resources.getResourceAsReader("..../mybatis-config.xml"); 
    Properties properties = new Properties(); 
    properties.setProperty("dbname", "mydb"); 
    SqlSessionFactory.factory = new SqlSessionFactoryBuilder().build(reader, "development", properties); 

然後,安迪·普賴爾發佈,在XML映射器使用select * from ${dbname}