mybatis執(zhí)行任意SQL問(wèn)題
mybatis執(zhí)行任意SQL
一、用一個(gè)方法可靈活方便執(zhí)任意自定義SQL
不需要在XML或接口中聲明,以下是實(shí)現(xiàn),采用注解,XML沒(méi)測(cè)試,應(yīng)該類(lèi)似。
1、聲明一個(gè)接口,里面包括一個(gè)超級(jí)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中對(duì)應(yīng)
params.put("id","xxx");
List<LinkedHashMap<String,Object>> result = medicineboxDao.sql("select * from DevLog where id =#{param.id}",params);
二、進(jìn)一步改進(jìn)時(shí)發(fā)現(xiàn)怪異的現(xiàn)象
因嘗試采用泛型作為結(jié)果轉(zhuǎn)型 ,這樣在查詢(xún)后通過(guò)泛型定義可獲得具體的類(lèi)型 ,可是結(jié)果卻出人意料,但又不報(bào)錯(cuò),希望有高手能指點(diǎn)下。代碼如下
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í)行不報(bào)錯(cuò),但獲得的結(jié)果卻是結(jié)果集有多個(gè)時(shí)只有一條數(shù)據(jù),并且只有第一個(gè)字段的值。
當(dāng)嘗試獲得集合里面的類(lèi)時(shí),報(bào)類(lèi)轉(zhuǎn)換異常。
//System.out.println(o2.get(0).getClass());當(dāng)獲得結(jié)果的CLASS對(duì)象時(shí),報(bào)錯(cuò)了
沒(méi)有跟進(jìn)MYBATIS相關(guān)的源碼,猜測(cè)是數(shù)據(jù)轉(zhuǎn)換方面沒(méi)有識(shí)別好。
三、繼續(xù)改進(jìn),實(shí)現(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,性能強(qiáng)勁
//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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
List調(diào)用toString()方法后,去除兩頭的中括號(hào)實(shí)例
下面小編就為大家?guī)?lái)一篇List調(diào)用toString()方法后,去除兩頭的中括號(hào)實(shí)例。希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
詳解Spring中使用@within與@target的區(qū)別
這篇文章主要介紹了Spring中使用@within與@target的一些區(qū)別,本文通過(guò)項(xiàng)目案例給大家詳細(xì)分析,給大家介紹的非常詳細(xì),代碼簡(jiǎn)單易懂,需要的朋友可以參考下2021-09-09
java打成jar后,獲取resources下的文件資源問(wèn)題及解決
作者在寫(xiě)代碼時(shí)遇到一個(gè)問(wèn)題:在將項(xiàng)目打包成jar包后,無(wú)法通過(guò)常規(guī)方式獲取resources文件夾下的資源,通過(guò)分析原因,作者找到了一種新的解決方案,即通過(guò)類(lèi)加載器獲取jar包內(nèi)的資源,此方式返回后的資源以文件流的形式返回,作者將其轉(zhuǎn)換為了byte[]的形式使用2026-05-05
在CentOS系統(tǒng)中檢測(cè)Java安裝及運(yùn)行jar應(yīng)用的方法
這篇文章主要介紹了在CentOS系統(tǒng)中檢測(cè)Java安裝及運(yùn)行jar應(yīng)用的方法,同樣適用于Fedora等其他RedHat系的Linux系統(tǒng),需要的朋友可以參考下2015-06-06
Java實(shí)現(xiàn)汽車(chē)租賃系統(tǒng)
這篇文章介紹了Java實(shí)現(xiàn)汽車(chē)租賃系統(tǒng)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
學(xué)會(huì)CompletableFuture輕松駕馭異步編程
這篇文章主要為大家介紹了CompletableFuture輕松駕馭異步編程教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Java中File文件操作類(lèi)的超詳細(xì)使用教程
File類(lèi)在包java.io.File下、代表操作系統(tǒng)的文件對(duì)象(文件、文件夾),File類(lèi)提供了諸如:定位文件,獲取文件本身的信息、刪除文件、創(chuàng)建文件(文件夾)等功能,下面這篇文章主要給大家介紹了關(guān)于Java中File文件操作類(lèi)的超詳細(xì)使用教程,需要的朋友可以參考下2023-01-01
Java對(duì)象轉(zhuǎn)換的實(shí)現(xiàn)方式匯總
這篇文章主要介紹了Java對(duì)象轉(zhuǎn)換的多種實(shí)現(xiàn)方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-04-04

