0

(私はTeradatav12全体でMyBatisv3、Java SE v6、Tomcat v6、Spring v3を使用しています。)

現在のプロジェクトの技術要件の1つは、Teradataのクエリバンディング機能を使用することです。これは、必要に応じて次のようなステートメントを実行することで実行されます。

SET QUERY_BAND='someKey=someValue;' FOR TRANSACTION;

すべての通話にクエリバンドが必要です。<select>ただし、次のようにマッパーファイルの各ステートメントに追加せずに、この機能をクリーンで再利用可能な方法で追加する方法がわかりません。

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

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

<select>上記に関する私の問題は次のとおりです。1)クエリバンドの形式は、 (など)ごとにカスタマイズしたいkとvを除いて、すべてのマッパーXMLファイルで同じです。k値とv値を渡さずにこのカスタマイズを行う方法がわかりません。これにより、マッパーインターフェイスが混乱します。2)上記のコードに重複があり、不安になります。開発者は、queryBand SQLを含めることを忘れないでください。これは、ある段階で誰かが忘れてしまいます(マーフィーの法則)。

誰かが私をよりクリーンな方法でクエリバンディングを実装するための解決策の方向に向けることができますか?

4

2 に答える 2

1

解決策は、MyBatisInterceptorプラグインを使用することです。たとえば、次のようになります。

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) {}
}
于 2011-06-24T14:57:31.553 に答える
0

すべてのSQL文字列をクエリバンドに追加する必要があるとしましょう。myBatis/Spring内でそれを行うメソッドを見つけようとします。SpringのAOPを使用すると、このメソッドがインターセプトされ、その結果がクエリバンドに追加され、さらに計算するために返される可能性があります。

傍受する方法を見つけるのは難しいかもしれませんが、不可能ではありません。すべての依存関係ソースをダウンロードして適切にリンクし(Mavenを使用すると、これはささいなことですが、Eclipseでもそれほど難しくはありません)、デバッグモードでコードを実行し、適切なメソッドを探します。

于 2011-06-23T09:24:00.493 に答える