首先是问题:我使用XML定义的查询,SQL包含数据库名称作为表名的一部分。例如:SELECT * from mydb.bar
。不幸的是,数据库是在所有地方创建/命名的,mudb
部分非常动态,可以随时更改。所以我想用属性替换它,所以它看起来像SELECT * FROM ${dbname}.bar
然后我在mybatis-config.xml中定义了以下部分:
<properties>
<property name="dbname" value="mydb"/>
</properties>
但是当我运行查询${dbname}
时,求值为null。如果我在属性文件中定义此属性,也会发生相同的情况我不想将此作为每个调用参数的一部分传递,因为这是一个真正的全局属性。可以这样做吗?如果是的话 - 怎么样?
答案 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}
。