Java 将SET语句与MyBatis一起使用

Java 将SET语句与MyBatis一起使用,java,mybatis,Java,Mybatis,(我在Teradata v12上使用MyBatis v3、Java SE v6、Tomcat v6和Spring v3。) 我当前项目的技术要求之一是在Teradata中使用查询带状功能。这是通过在需要时运行如下语句来完成的: SET QUERY\u BAND='someKey=someValue;'用于交易 我想为我所有的电话设置一个查询带。但是,我不确定如何以干净和可重用的方式添加此功能,而不必将其添加到映射器文件中的每个语句中,如下所示: <sql id="queryBand">

(我在Teradata v12上使用MyBatis v3、Java SE v6、Tomcat v6和Spring v3。)

我当前项目的技术要求之一是在Teradata中使用查询带状功能。这是通过在需要时运行如下语句来完成的:

SET QUERY\u BAND='someKey=someValue;'用于交易

我想为我所有的电话设置一个查询带。但是,我不确定如何以干净和可重用的方式添加此功能,而不必将其添加到映射器文件中的每个
语句中,如下所示:

<sql id="queryBand"> 
    SET QUERY_BAND='k=v;' FOR TRANSACTION; 
</sql>

<select ...> 
   <include refid="queryBand"/> 
   ... some SQL performing a SELECT 
</select>

设置查询\u BAND='k=v;'用于交易;
... 某些SQL执行SELECT操作
我对上述问题的看法是: 1) 查询带的格式在我所有的mapper XML文件中都是相同的,但k&v除外,我想根据每个
(等等)对其进行定制。我不知道如何在不需要传递k和v值的情况下进行定制,这会弄脏我的映射器界面。 2) 上面的代码中存在重复,这让我感到不安。开发人员必须记住包含queryBand SQL,有些人在某个阶段会忘记它(墨菲定律)


有人能为我指出解决方案的方向,以更干净的方式实现查询绑定吗

假设每个SQL字符串都应该附加到查询带。我会尝试在myBatis/Spring中找到一种方法来实现这一点。使用Spring的AOP可以截取此方法,并将其结果附加到查询带中,然后返回以供进一步计算


找到拦截的方法可能很难,但并非不可能。下载所有依赖源并正确链接它们(使用Maven这应该很简单,但在Eclipse中也不难),在调试模式下运行代码并寻找合适的方法。

解决方案是使用MyBatis拦截器插件。例如,以下各项:

import java.sql.Connection;
import java.sql.Statement;
import java.util.Properties;

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;

@Intercepts({@Signature(
        type=StatementHandler.class,
        method = "prepare",
        args={ Connection.class })})
public class StatementInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Connection conn = (Connection) invocation.getArgs()[0];
        Statement stmt = conn.createStatement();
        stmt.executeUpdate("SET QUERY_BAND = 'k=v;' FOR TRANSACTION;");
        return invocation.proceed();
    }

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

    @Override
    public void setProperties(Properties properties) {}
}

是的,我正在考虑这个解决办法。然而,没有明显的拦截方法。我目前正在研究MyBatis
Inteceptors
idea。。。但是示例和文档很少。我必须更新到
args={Connection.class,Integer.class}
,因为我必须有一个不同的
StatementHandler
类。此外,根据您的用例,您可能必须更改事务的
到会话的