2011-06-23 50 views
0

(我用的MyBatis V3,Java SE的V6發動機,Tomcat的V6和Spring V3各地的Teradata V12)。使用SET語句與MyBatis的

一個爲我的當前項目的技術要求是使用查詢綁紮功能在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> 

我對上述問題有: 1)除了k & v之外,查詢頻段的格式在我所有的映射器XML文件中都是相同的,我想根據每個<select>(等)基礎自定義該格式。我不知道如何在不必傳入k和v值的情況下執行此自定義,這會使我的映射器界面變得模糊。 2)上面的代碼有重複,讓我不安。開發人員必須記住要包含queryBand SQL,在某個階段(墨菲法則),有人會忘記它。

有人可以指點我的解決方案,以更清晰的方式實現查詢條帶?

回答

0

解決方案是使用MyBatis Interceptor插件。例如,以下內容:

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) {} 
} 
0

假設每個SQL字符串都應該附加到查詢帶上。我會嘗試在myBatis/Spring裏面找到一個方法。使用Spring的AOP可以截取這個方法,並將其結果附加到查詢頻帶並返回進一步計算。

找到一個攔截方法可能很難但並非不可能。下載所有的依賴關係源並正確地鏈接它們(使用Maven這應該是微不足道的,但在Eclipse中並不那麼難),以調試模式運行代碼並尋找合適的方法。

+0

是的,我正在考慮該解決方案。但是,沒有明顯的攔截方法。我目前正在研究MyBatis'Inteceptors'的想法...但實例和文檔都很少。 – Mark