2012-11-14 70 views
7

我有一個使用mybatis進行對象持久化的應用程序。但是我需要運行任意sql(來自用戶)。我可以用mybatis來做嗎?如何使用mybatis運行任意sql?

更新:

我選擇使用dbutils(JDBC)來運行用戶定義的SQL,但我需要的數據源的一個實例來創建QueryRunner。有什麼辦法可以從mybatis獲取數據源?

回答

7

我用這個utilitary類:

import java.util.List; 
import org.apache.ibatis.annotations.SelectProvider; 

public interface SqlMapper { 
    static class PureSqlProvider { 
     public String sql(String sql) { 
      return sql; 
     } 

     public String count(String from) { 
      return "SELECT count(*) FROM " + from; 
     } 
    } 

    @SelectProvider(type = PureSqlProvider.class, method = "sql") 
    public List<?> select(String sql); 

    @SelectProvider(type = PureSqlProvider.class, method = "count") 
    public Integer count(String from); 

    @SelectProvider(type = PureSqlProvider.class, method = "sql") 
    public Integer execute(String query); 
} 
+0

我得到一個UnsupportedOperationException當我嘗試這個.. –

+0

@OrGal我在我的應用程序中使用這個類一段時間。你運行什麼(代碼)來獲得這個異常? –

+0

@italo,謝謝你的回答,但它不適用於有多個句子的sql文件嗎? – Suge

2

你的問題是類似我已經考慮到這個問題的答案的How to exequte query directly from java code using mybatis?

的問題。但我希望這個解決方案能幫助你。

Mybatis已經有了這個功能,但是您必須使用如下的適配器。

  1. 創建一個適配器類;

    public class SQLAdapter { 
    String sql; 
    
    public SQLAdapter(String sql) { 
        this.sql = sql; 
    } 
    
    public String getSql() { 
        return sql; 
    } 
    
    public void setSql(String sql) { 
        this.sql = sql; 
    } } 
    
  2. 創建類SQLAdapter的typeAlias

<typeAlias alias="sqladapter" type="com.zj.xxx.xxx.SQLAdapter" />

  • 中的每個對象的XML

    把選擇標記在需要直接執行sql。

    <select id="findRecords" parameterType="SQLAdapter" resultMap="xxxxxResultMap"> 
        ${sql} 
    </select> 
    
  • 呼叫等

  • String _sql = "select * from table where... order by... limit..."; 
    xxxxx.findRecords(new SQLAdapter(_sql)); 
    
    此選擇方法
    1. 事情已經全部完成。您不能再在xml文件中編寫複雜的sql語言。祝你好運。
    1

    根據提供的答案,他們都很好。但他們都需要使用Adapter類。

    使用的MyBatis版本3,我成功使用HashMap<String, String>保持並傳遞SQL

    請參閱下面的代碼。

    Mapper

    final String sql = "${sql}"; 
    
    @Select(sql) 
    void execute(HashMap<String, String> m); 
    

    時調用的方法:

    String sql = "SELECT * FROM record limit 1"; 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put("sql", sql); 
    mapper.execute(map); 
    

    HashMap規定,你沒有定義類的屬性,或代碼字段的方式,你可以使用一個地圖來定義它redomly。

    謝謝。

    +0

    我在執行maven構建時在我的映射器類中出現以下錯誤。有小費嗎? 不兼容的類型:java.util.Map 不能轉換爲java.lang.String – Razvi

    +0

    你知道如何將參數傳遞給動態查詢嗎? – Razvi

    0

    SQL的可重用片段可用於動態創建查詢的選擇部分。在你映射器通過查詢作爲參數正常:

    @Param("sql")String sql

    在您的查詢只訪問使用$ {} SQL代替#{} SQL參數。 參數sql中的值可以是完全有效的sql查詢或sql查詢的片段。

    相關問題