Java 将SET语句与MyBatis一起使用
(我在Teradata v12上使用MyBatis v3、Java SE v6、Tomcat v6和Spring v3。) 我当前项目的技术要求之一是在Teradata中使用查询带状功能。这是通过在需要时运行如下语句来完成的: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">
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) {}
}
是的,我正在考虑这个解决办法。然而,没有明显的拦截方法。我目前正在研究MyBatisInteceptors
idea。。。但是示例和文档很少。我必须更新到args={Connection.class,Integer.class}
,因为我必须有一个不同的StatementHandler
类。此外,根据您的用例,您可能必须更改事务的代码>到会话的代码>