我有一個使用mybatis進行對象持久化的應用程序。但是我需要運行任意sql(來自用戶)。我可以用mybatis來做嗎?如何使用mybatis運行任意sql?
更新:
我選擇使用dbutils(JDBC)來運行用戶定義的SQL,但我需要的數據源的一個實例來創建QueryRunner。有什麼辦法可以從mybatis獲取數據源?
我有一個使用mybatis進行對象持久化的應用程序。但是我需要運行任意sql(來自用戶)。我可以用mybatis來做嗎?如何使用mybatis運行任意sql?
更新:
我選擇使用dbutils(JDBC)來運行用戶定義的SQL,但我需要的數據源的一個實例來創建QueryRunner。有什麼辦法可以從mybatis獲取數據源?
我用這個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);
}
你的問題是類似我已經考慮到這個問題的答案的How to exequte query directly from java code using mybatis?
的問題。但我希望這個解決方案能幫助你。
Mybatis已經有了這個功能,但是您必須使用如下的適配器。
創建一個適配器類;
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;
} }
創建類SQLAdapter的typeAlias
<typeAlias alias="sqladapter" type="com.zj.xxx.xxx.SQLAdapter" />
把選擇標記在需要直接執行sql。
<select id="findRecords" parameterType="SQLAdapter" resultMap="xxxxxResultMap">
${sql}
</select>
呼叫等
此選擇方法String _sql = "select * from table where... order by... limit..."; xxxxx.findRecords(new SQLAdapter(_sql));
根據提供的答案,他們都很好。但他們都需要使用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。
謝謝。
SQL的可重用片段可用於動態創建查詢的選擇部分。在你映射器通過查詢作爲參數正常:
@Param("sql")String sql
在您的查詢只訪問使用$ {} SQL代替#{} SQL參數。 參數sql中的值可以是完全有效的sql查詢或sql查詢的片段。
我得到一個UnsupportedOperationException當我嘗試這個.. –
@OrGal我在我的應用程序中使用這個類一段時間。你運行什麼(代碼)來獲得這個異常? –
@italo,謝謝你的回答,但它不適用於有多個句子的sql文件嗎? – Suge