MyBatis - 定义全局参数

Bos*_*one 8 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>
Run Code Online (Sandbox Code Playgroud)

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

And*_*ndy 6

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

configuration.getVariables().put("global_param", "123");
Run Code Online (Sandbox Code Playgroud)

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

    select * from ${global_param}
Run Code Online (Sandbox Code Playgroud)


Raf*_*aff 5

我在使用 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>
Run Code Online (Sandbox Code Playgroud)