<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
先說結論:
當輸入引數只有一個且沒有使用@Param註解時,MyBatis會直接傳遞這個引數;當輸入引數多於一個,或者使用了@Param註解時,MyBatis會將引數封裝在Map中傳遞,這時的Map的key分為以下幾種可能:
下面來看一下原始碼。
首先,判斷一個方法中是否有用@Param註解的引數:
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註解的引數,取出註解中給出的引數名:
private String getParamNameFromAnnotation(Method method, int i, String paramName) { final Object[] paramAnnos = method.getParameterAnnotations()[i]; // 獲取第i個引數的註解 for (Object paramAnno : paramAnnos) { if (paramAnno instanceof Param) { paramName = ((Param) paramAnno).value(); break; } } return paramName; }
注意方法的輸入引數,method表示是哪個方法上,i 表示第幾個引數, paramName是傳進來的引數名,如果該引數沒有用@Param註解,則返回傳進來的paramName。
下面這個方法返回一個TreeMap(有序),其key表示引數的順序,比如key=0代表第0個引數;value表示引數的名字,如果有用@Param註解標註,則為標註的引數名,否則和key相等,即用引數的序號作為引數的名字。
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()); // 引數名,預設為引數的序號 if (hasNamedParameters) { //如果有使用@Param註解,則獲取註解標註的引數名 paramName = getParamNameFromAnnotation(method, i, paramName); // 這裡paramName作為引數傳進來,表示預設值 } params.put(i, paramName); } } return params; }
其中hasNamedParameters只是從整個方法的維度,給出該方法是否有使用@Param註解的引數;即使其值為true,具體到某一個引數上面,可能沒有使用@Param註解,因此呼叫getParamNameFromAnnotation傳入的paramName就作為預設值返回,即引數的序號。
最後將呼叫方法的引數轉換為MyBatis內部使用的引數:
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方法的輸入引數,這裡已經轉換成了陣列,其實就是動態代理的invoke方法傳入的引數。
該方法首先對輸入引數進行計數,使用的params就是前面介紹的getParams方法的返回值。
if (!hasNamedParameters && paramCount == 1)
上面的條件判斷,即方法沒有使用@Param註解,且只有一個引數,這時返回
args[params.keySet().iterator().next().intValue()]
即直接將其作為Object返回。
如果上面的條件不滿足的話,首先新建一個Map作為返回值:
final Map<String, Object> param = new ParamMap<Object>();
然後,設定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()]); }
即設定param1、param2這樣的key。
到此為止,需要的引數物件Object就構建完成,其中封裝了Dao傳入的多個引數,並根據引數是否有@Param註解,影響了引數物件的型別(是否是map)。
引數封裝完成之後,下一步將其傳遞給SqlSession。
到此這篇關於MyBatis @Param註解的實現的文章就介紹到這了,更多相關MyBatis @Param註解內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45