簡體   English   中英

MyBatis - 定義全局參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM