mybatis執(zhí)行任意SQL問題
mybatis執(zhí)行任意SQL
一、用一個方法可靈活方便執(zhí)任意自定義SQL
不需要在XML或接口中聲明,以下是實現(xiàn),采用注解,XML沒測試,應該類似。
1、聲明一個接口,里面包括一個超級SQL方法
public interface SqlDao{
@Select("${sql}")
List<LinkedHashMap<String,Object>> sql(String sql,@Param("param") Map<String,Object> param);
}
2、調(diào)用
Map<String,Object> params = new HashMap<>();
//這里可加任意多參數(shù),與SQL中對應
params.put("id","xxx");
List<LinkedHashMap<String,Object>> result = medicineboxDao.sql("select * from DevLog where id =#{param.id}",params);
二、進一步改進時發(fā)現(xiàn)怪異的現(xiàn)象
因嘗試采用泛型作為結(jié)果轉(zhuǎn)型 ,這樣在查詢后通過泛型定義可獲得具體的類型 ,可是結(jié)果卻出人意料,但又不報錯,希望有高手能指點下。代碼如下
1、先改造上面的接口方法為泛型。
public interface SqlDao{
@Select("${sql}")
<S> List<S> sql2(String sql,@Param("param") Map<String,Object> param);
}
//調(diào)用
List<DevLog> o2 = medicineboxDao.sql2("select * from DevLog where id =#{param.id}",params);
執(zhí)行不報錯,但獲得的結(jié)果卻是結(jié)果集有多個時只有一條數(shù)據(jù),并且只有第一個字段的值。
當嘗試獲得集合里面的類時,報類轉(zhuǎn)換異常。
//System.out.println(o2.get(0).getClass());當獲得結(jié)果的CLASS對象時,報錯了
沒有跟進MYBATIS相關的源碼,猜測是數(shù)據(jù)轉(zhuǎn)換方面沒有識別好。
三、繼續(xù)改進,實現(xiàn)泛型轉(zhuǎn)換
改造接口為如下:
@Select({"${sql}"})
default <S> List<S> sqlFromObject(String sql,@Param("param") Map<String,Object> param,Class<S> sc){
final List<S> lis = new ArrayList<>();
this.generalSql(sql, param, (ResultHandler<S>) resultContext -> {
try {
S s = sc.newInstance();
//采用cglib BeanCopier,性能強勁
//bean map拷貝
BeanMap beanMap = BeanMap.create(s);
beanMap.putAll((Map)resultContext.getResultObject());
lis.add(s);
} catch (Exception e) {
e.printStackTrace();
}
});
return lis;
};
@Select({"${sql}"})
@ResultType(LinkedHashMap.class)
<S> void generalSql(String sql, @Param("param") Map<String,Object> param, ResultHandler<S> handler) ;
然后調(diào)用:
List<DevLog> o2 = medicineboxDao.sqlFromObject("select * from DevLog where id <>#{param.id}",params,DevLog.class);
還算完美吧??!
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
List調(diào)用toString()方法后,去除兩頭的中括號實例
下面小編就為大家?guī)硪黄狶ist調(diào)用toString()方法后,去除兩頭的中括號實例。希望對大家有所幫助。一起跟隨小編過來看看吧2017-03-03
詳解Spring中使用@within與@target的區(qū)別
這篇文章主要介紹了Spring中使用@within與@target的一些區(qū)別,本文通過項目案例給大家詳細分析,給大家介紹的非常詳細,代碼簡單易懂,需要的朋友可以參考下2021-09-09
java打成jar后,獲取resources下的文件資源問題及解決
作者在寫代碼時遇到一個問題:在將項目打包成jar包后,無法通過常規(guī)方式獲取resources文件夾下的資源,通過分析原因,作者找到了一種新的解決方案,即通過類加載器獲取jar包內(nèi)的資源,此方式返回后的資源以文件流的形式返回,作者將其轉(zhuǎn)換為了byte[]的形式使用2026-05-05
在CentOS系統(tǒng)中檢測Java安裝及運行jar應用的方法
這篇文章主要介紹了在CentOS系統(tǒng)中檢測Java安裝及運行jar應用的方法,同樣適用于Fedora等其他RedHat系的Linux系統(tǒng),需要的朋友可以參考下2015-06-06

