MyBatis - 定义全局参数

时间:2011-12-05 22:23:20

标签: java parameters global mybatis

首先是问题:我使用XML定义的查询,SQL包含数据库名称作为表名的一部分。例如:SELECT * from mydb.bar。不幸的是,数据库是在所有地方创建/命名的,mudb部分非常动态,可以随时更改。所以我想用属性替换它,所以它看起来像SELECT * FROM ${dbname}.bar然后我在mybatis-config.xml中定义了以下部分:

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

但是当我运行查询${dbname}时,求值为null。如果我在属性文件中定义此属性,也会发生相同的情况我不想将此作为每个调用参数的一部分传递,因为这是一个真正的全局属性。可以这样做吗?如果是的话 - 怎么样?

3 个答案:

答案 0 :(得分:6)

是的,你可以!这可能是一种奇怪的无证特征。构建Configuration对象时,请执行以下操作。 (org.apache.ibatis.session.Configuration)

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

然后在您的XML地图中,您可以参考。

    select * from ${global_param}

答案 1 :(得分:4)

我使用Spring + MyBatis遇到了同样的问题,并通过使用我对sqlSessionFactory的Spring XML定义设置'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>

答案 2 :(得分:0)

我使用的是XML配置但不是Spring,并在Configuration对象中设置了一个属性,但发现必须在加载映射器文件之前完成(参见here)。我放弃了配置对象的方法,并采用了这种方法,这对我有用:

  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}