[英]MyBatis - defining a global parameter
首先是問題:我使用XML定義的查詢,SQL包含數據庫名稱作為表名的一部分。 例如: SELECT * from mydb.bar
。 不幸的是,數據庫是在所有地方創建/命名的,而mudb
部分實際上是動態的,並且可以隨時改變。 所以我想用屬性替換它,所以它看起來像SELECT * FROM ${dbname}.bar
然后我在mybatis-config.xml中定義了以下部分:
<properties>
<property name="dbname" value="mydb"/>
</properties>
但是當我運行查詢時, ${dbname}
計算結果為null。 如果我在屬性文件中定義此屬性,也會發生相同的情況 我不想將此作為每個調用參數的一部分傳遞,因為這是一個真正的全局屬性。 可以這樣做嗎? 如果是 - 怎么樣?
是的你可以! 這可能是一種奇怪的無證特征。 構建Configuration對象時,請執行以下操作。 (org.apache.ibatis.session.Configuration)
configuration.getVariables().put("global_param", "123");
然后在XML地圖中,您可以參考。
select * from ${global_param}
我使用Spring + MyBatis遇到了同樣的問題,並通過使用我的Spring XML定義為sqlSessionFactory設置'configurationProperties'來解決它。 下面的示例顯示了如何設置名為“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>
我使用的是XML配置但不是Spring,並在Configuration對象中設置了一個屬性,但發現必須在加載映射器文件之前完成(參見此處 )。 我放棄了配置對象的方法,並采用這種方法,這對我有用:
Reader reader = Resources.getResourceAsReader("..../mybatis-config.xml");
Properties properties = new Properties();
properties.setProperty("dbname", "mydb");
SqlSessionFactory.factory = new SqlSessionFactoryBuilder().build(reader, "development", properties);
然后,正如Andy Pryor發布的那樣,在XML映射器中使用select * from ${dbname}
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.