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

MyBatis @Param注解的實(shí)現(xiàn)

 更新時(shí)間:2022年04月01日 11:49:03   作者:masquee  
本文主要介紹了MyBatis @Param注解的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

先說(shuō)結(jié)論:

當(dāng)輸入?yún)?shù)只有一個(gè)且沒(méi)有使用@Param注解時(shí),MyBatis會(huì)直接傳遞這個(gè)參數(shù);當(dāng)輸入?yún)?shù)多于一個(gè),或者使用了@Param注解時(shí),MyBatis會(huì)將參數(shù)封裝在Map中傳遞,這時(shí)的Map的key分為以下幾種可能:

  • Map中會(huì)有param1, param2這樣的key,其順序?qū)?yīng)輸入?yún)?shù)的順序。無(wú)論是否有@Param注解。
  • 對(duì)于@Param注解的參數(shù),Map中會(huì)保存注解中給定的名字作為key
  • 對(duì)于沒(méi)有用@Param注解的參數(shù),Map中會(huì)用1、2、3 ..這樣的數(shù)字作為key,按順序保存輸入?yún)?shù)。

下面來(lái)看一下源碼。

首先,判斷一個(gè)方法中是否有用@Param注解的參數(shù):

    private boolean hasNamedParams(Method method) {
      final Object[][] paramAnnos = method.getParameterAnnotations();
      for (Object[] paramAnno : paramAnnos) {
        for (Object aParamAnno : paramAnno) {
          if (aParamAnno instanceof Param) {
            return true;
          }
        }
      }
      return false;
    }

如果有用@Param注解的參數(shù),取出注解中給出的參數(shù)名:

    private String getParamNameFromAnnotation(Method method, int i, String paramName) {
      final Object[] paramAnnos = method.getParameterAnnotations()[i];    // 獲取第i個(gè)參數(shù)的注解
      for (Object paramAnno : paramAnnos) {
        if (paramAnno instanceof Param) {
          paramName = ((Param) paramAnno).value();
          break;
        }
      }
      return paramName;
    }

注意方法的輸入?yún)?shù),method表示是哪個(gè)方法上,i 表示第幾個(gè)參數(shù),  paramName是傳進(jìn)來(lái)的參數(shù)名,如果該參數(shù)沒(méi)有用@Param注解,則返回傳進(jìn)來(lái)的paramName。

下面這個(gè)方法返回一個(gè)TreeMap(有序),其key表示參數(shù)的順序,比如key=0代表第0個(gè)參數(shù);value表示參數(shù)的名字,如果有用@Param注解標(biāo)注,則為標(biāo)注的參數(shù)名,否則和key相等,即用參數(shù)的序號(hào)作為參數(shù)的名字。

    private SortedMap<Integer, String> getParams(Method method, boolean hasNamedParameters) {
      final SortedMap<Integer, String> params = new TreeMap<Integer, String>();
      final Class<?>[] argTypes = method.getParameterTypes();
      for (int i = 0; i < argTypes.length; i++) {
        if (!RowBounds.class.isAssignableFrom(argTypes[i]) && !ResultHandler.class.isAssignableFrom(argTypes[i])) {
          String paramName = String.valueOf(params.size());    // 參數(shù)名,默認(rèn)為參數(shù)的序號(hào)
          if (hasNamedParameters) {    //如果有使用@Param注解,則獲取注解標(biāo)注的參數(shù)名
            paramName = getParamNameFromAnnotation(method, i, paramName);    // 這里paramName作為參數(shù)傳進(jìn)來(lái),表示默認(rèn)值
          }
          params.put(i, paramName);
        }
      }
      return params;
    }

其中hasNamedParameters只是從整個(gè)方法的維度,給出該方法是否有使用@Param注解的參數(shù);即使其值為true,具體到某一個(gè)參數(shù)上面,可能沒(méi)有使用@Param注解,因此調(diào)用getParamNameFromAnnotation傳入的paramName就作為默認(rèn)值返回,即參數(shù)的序號(hào)。

最后將調(diào)用方法的參數(shù)轉(zhuǎn)換為MyBatis內(nèi)部使用的參數(shù):

 public Object convertArgsToSqlCommandParam(Object[] args) {
      final int paramCount = params.size();
      if (args == null || paramCount == 0) {
        return null;
      } else if (!hasNamedParameters && paramCount == 1) {
        return args[params.keySet().iterator().next().intValue()];
      } else {
        final Map<String, Object> param = new ParamMap<Object>();
        int i = 0;
        for (Map.Entry<Integer, String> entry : params.entrySet()) {
          param.put(entry.getValue(), args[entry.getKey().intValue()]);
          // issue #71, add param names as param1, param2...but ensure backward compatibility
          final String genericParamName = "param" + String.valueOf(i + 1);
          if (!param.containsKey(genericParamName)) {
            param.put(genericParamName, args[entry.getKey()]);
          }
          i++;
        }
        return param;
      }
    }

其中args為Dao方法的輸入?yún)?shù),這里已經(jīng)轉(zhuǎn)換成了數(shù)組,其實(shí)就是動(dòng)態(tài)代理的invoke方法傳入的參數(shù)。

該方法首先對(duì)輸入?yún)?shù)進(jìn)行計(jì)數(shù),使用的params就是前面介紹的getParams方法的返回值。

if (!hasNamedParameters && paramCount == 1)

上面的條件判斷,即方法沒(méi)有使用@Param注解,且只有一個(gè)參數(shù),這時(shí)返回

args[params.keySet().iterator().next().intValue()]

即直接將其作為Object返回。

如果上面的條件不滿(mǎn)足的話,首先新建一個(gè)Map作為返回值:

final Map<String, Object> param = new ParamMap<Object>();

然后,設(shè)置map的key和value:

param.put(entry.getValue(), args[entry.getKey().intValue()]);

然后為了兼容性,做了如下操作

final String genericParamName = "param" + String.valueOf(i + 1);
if (!param.containsKey(genericParamName)) {
    param.put(genericParamName, args[entry.getKey()]);
}

即設(shè)置param1、param2這樣的key。

到此為止,需要的參數(shù)對(duì)象Object就構(gòu)建完成,其中封裝了Dao傳入的多個(gè)參數(shù),并根據(jù)參數(shù)是否有@Param注解,影響了參數(shù)對(duì)象的類(lèi)型(是否是map)。

參數(shù)封裝完成之后,下一步將其傳遞給SqlSession。

到此這篇關(guān)于MyBatis @Param注解的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis @Param注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java設(shè)計(jì)模式之原型模式詳解

    Java設(shè)計(jì)模式之原型模式詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之原型模式詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java基礎(chǔ)之Stream流原理與用法詳解

    Java基礎(chǔ)之Stream流原理與用法詳解

    從Java1.8開(kāi)始提出了Stream流的概念,側(cè)重對(duì)于源數(shù)據(jù)計(jì)算能力的封裝,并且支持序列與并行兩種操作方式。本文就來(lái)為大家詳細(xì)講講Stream流原理與用法
    2022-08-08
  • Java?Runnable和Thread實(shí)現(xiàn)多線程哪個(gè)更好你知道嗎

    Java?Runnable和Thread實(shí)現(xiàn)多線程哪個(gè)更好你知道嗎

    這篇文章主要為大家詳細(xì)介紹了Java?Runnable和Thread實(shí)現(xiàn)多線程哪個(gè)更好,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>
    2022-03-03
  • Java向數(shù)據(jù)庫(kù)插入中文出現(xiàn)亂碼解決方案

    Java向數(shù)據(jù)庫(kù)插入中文出現(xiàn)亂碼解決方案

    這篇文章主要介紹了Java向數(shù)據(jù)庫(kù)插入中文出現(xiàn)亂碼解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 詳解MyBatis resultType與resultMap中的幾種返回類(lèi)型

    詳解MyBatis resultType與resultMap中的幾種返回類(lèi)型

    本文主要介紹了MyBatis resultType與resultMap中的幾種返回類(lèi)型,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java語(yǔ)言之包和繼承詳解

    Java語(yǔ)言之包和繼承詳解

    這篇文章主要介紹了java的包和繼承,結(jié)合實(shí)例形式詳細(xì)分析了Java繼承的概念、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2021-09-09
  • Java zookeeper圖形化工具ZooInspector用法詳解

    Java zookeeper圖形化工具ZooInspector用法詳解

    這篇文章主要介紹了Java zookeeper圖形化工具ZooInspector用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot項(xiàng)目中出現(xiàn)不同端口跨域問(wèn)題的解決方法

    SpringBoot項(xiàng)目中出現(xiàn)不同端口跨域問(wèn)題的解決方法

    這篇文章主要介紹了SpringBoot項(xiàng)目中出現(xiàn)不同端口跨域問(wèn)題的解決方法,文中介紹了兩種解決方法,并給出了詳細(xì)的代碼供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-03-03
  • Spring Core核心類(lèi)庫(kù)的功能與應(yīng)用實(shí)踐分析

    Spring Core核心類(lèi)庫(kù)的功能與應(yīng)用實(shí)踐分析

    本文詳細(xì)介紹了SpringCore核心類(lèi)庫(kù)的功能、應(yīng)用實(shí)踐和底層原理,SpringCore提供了控制反轉(zhuǎn)(IOC)、依賴(lài)注入(DI)、Bean管理以及JNDI、定時(shí)任務(wù)等企業(yè)級(jí)功能,文章通過(guò)多個(gè)Java示例展示了SpringCore的應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 詳述IntelliJ IDEA遠(yuǎn)程調(diào)試Tomcat的方法(圖文)

    詳述IntelliJ IDEA遠(yuǎn)程調(diào)試Tomcat的方法(圖文)

    本篇文章主要介紹了詳述IntelliJ IDEA遠(yuǎn)程調(diào)試Tomcat的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12

最新評(píng)論

蓬安县| 巴青县| 阳西县| 淄博市| 陆河县| 慈溪市| 玉树县| 蕲春县| 三都| 彭州市| 清徐县| 临朐县| 都江堰市| 临安市| 砀山县| 永吉县| 博野县| 金秀| 汤阴县| 山阴县| 疏附县| 嘉禾县| 安吉县| 汨罗市| 房产| 宾阳县| 昌图县| 新田县| 晋州市| 济南市| 淮安市| 桃江县| 贺兰县| 沂水县| 温宿县| 虎林市| 石林| 房产| 苏州市| 全南县| 田阳县|