最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis執(zhí)行任意SQL問(wèn)題

 更新時(shí)間:2026年05月18日 08:39:29   作者:continentlu  
文章主要介紹了使用MyBatis執(zhí)行任意SQL的方法,包括聲明接口、使用注解調(diào)用等步驟,并提到嘗試使用泛型進(jìn)行結(jié)果集處理時(shí)遇到的問(wèn)題,最后給出一種改進(jì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í)例

    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ū)別

    這篇文章主要介紹了Spring中使用@within與@target的一些區(qū)別,本文通過(guò)項(xiàng)目案例給大家詳細(xì)分析,給大家介紹的非常詳細(xì),代碼簡(jiǎn)單易懂,需要的朋友可以參考下
    2021-09-09
  • java打成jar后,獲取resources下的文件資源問(wèn)題及解決

    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)用的方法

    這篇文章主要介紹了在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)

    這篇文章介紹了Java實(shí)現(xiàn)汽車(chē)租賃系統(tǒng)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Java動(dòng)態(tài)代理簡(jiǎn)單介紹

    Java動(dòng)態(tài)代理簡(jiǎn)單介紹

    動(dòng)態(tài)代理指的是,代理類(lèi)和目標(biāo)類(lèi)的關(guān)系在程序運(yùn)行的時(shí)候確定的,客戶(hù)通過(guò)代理類(lèi)來(lái)調(diào)用目標(biāo)對(duì)象的方法,是在程序運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)的創(chuàng)建目標(biāo)類(lèi)的代理對(duì)象。本文將通過(guò)案例詳細(xì)講解一下Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn),需要的可以參考一下
    2022-08-08
  • 學(xué)會(huì)CompletableFuture輕松駕馭異步編程

    學(xué)會(huì)CompletableFuture輕松駕馭異步編程

    這篇文章主要為大家介紹了CompletableFuture輕松駕馭異步編程教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • java常見(jiàn)的序列化方式

    java常見(jiàn)的序列化方式

    這篇文章主要為大家詳細(xì)介紹了java中兩種常見(jiàn)的序列化方式,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Java中File文件操作類(lèi)的超詳細(xì)使用教程

    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)方式匯總

    這篇文章主要介紹了Java對(duì)象轉(zhuǎn)換的多種實(shí)現(xiàn)方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-04-04

最新評(píng)論

民权县| 长兴县| 商城县| 辽宁省| 左贡县| 德安县| 苏州市| 纳雍县| 山阳县| 侯马市| 乌兰察布市| 城固县| 张家川| 张北县| 彭泽县| 青铜峡市| 神池县| 金溪县| 厦门市| 砀山县| 塔河县| 法库县| 四川省| 始兴县| 黎城县| 公安县| 三都| 会宁县| 奉新县| 墨竹工卡县| 科技| 桃园市| 黑水县| 尤溪县| 博白县| 宁阳县| 宣化县| 虹口区| 定南县| 永宁县| 夏津县|