gpt4 book ai didi

java - Mybatis关于配置参数的条件

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:39 25 4
gpt4 key购买 nike

我试图有一个条件查询片段,基于来自 mybatis 配置的参数,而不是查询参数。像这样的事情:

<sql id="frag">
<if test="col_name != null">
SELECT * FROM TABLE WHERE ${col.name}=#{value}
</if>
<if test="col_name == null">
SELECT * FROM TABLE WHERE SAMPLECOL=#{value}
</if>
</sql>

其中col_name的值是一个全局参数,在mybatis配置读取的.properties文件中指定。

显然这不起作用;查看源代码,似乎 OGNL 表达式求值器不知道配置属性(当我通过 SQL 内部的 ${...} 进行参数替换时,配置属性会起作用)。有人找到办法做到这一点吗?

最佳答案

我发现目前这是不可能的; OGNL 实际上无法访问配置属性。

作为解决方法,如 this post 中建议的那样在 mybatis 邮件列表上,我编写了一个简单的拦截器,它读取配置参数并将它们添加到查询参数映射中。不完全干净,但它有效。

拦截器代码:

@Intercepts({
@Signature(type = Executor.class,
method = "query",
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
public class ConfigPropInterceptor implements Interceptor {

private final Map<String, Object> properties = new HashMap<String, Object>();

@Override
public Object intercept(Invocation invocation) throws Throwable {
Object param = invocation.getArgs()[1];
if (param instanceof Map) {
((Map<String, Object>)param).putAll(properties);
}
return invocation.proceed();
}

@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}

@Override
public void setProperties(Properties properties) {
for (String p : properties.stringPropertyNames()) {
this.properties.put(p, properties.getProperty(p));
}
}
}

配置 .xml 中的示例用法:

<plugins>
<plugin interceptor="...ConfigPropInterceptor">
<property name="_issuerLocation" value="${issuer.location}"/>
</plugin>
</plugins>

通过此设置,我能够像其他所有内容一样测试 OGNL 表达式中的 _issuerLocation 变量。

关于java - Mybatis关于配置参数的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11635391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com