mybatis的ParamNameResolver參數(shù)名稱解析
序
在mybatis的interceptor獲取MapperMethod.ParamMap這種參數(shù)類型時,經(jīng)常會多出param1,param2,collection,list,array這些參數(shù),這些不是接口自己定義的,而是ParamNameResolver自動添加的
ParamNameResolver
org/apache/ibatis/reflection/ParamNameResolver.java
public class ParamNameResolver { public static final String GENERIC_NAME_PREFIX = "param"; /** * <p> * A single non-special parameter is returned without a name. * Multiple parameters are named using the naming rule. * In addition to the default names, this method also adds the generic names (param1, param2, * ...). * </p> * * @param args * the args * @return the named params */ public Object getNamedParams(Object[] args) { final int paramCount = names.size(); if (args == null || paramCount == 0) { return null; } else if (!hasParamAnnotation && paramCount == 1) { Object value = args[names.firstKey()]; return wrapToMapIfCollection(value, useActualParamName ? names.get(0) : null); } else { final Map<String, Object> param = new ParamMap<>(); int i = 0; for (Map.Entry<Integer, String> entry : names.entrySet()) { param.put(entry.getValue(), args[entry.getKey()]); // add generic param names (param1, param2, ...) final String genericParamName = GENERIC_NAME_PREFIX + (i + 1); // ensure not to overwrite parameter named with @Param if (!names.containsValue(genericParamName)) { param.put(genericParamName, args[entry.getKey()]); } i++; } return param; } } //...... }
getNamedParams方法針對單個參數(shù)沒有加@Param的場景會調(diào)用wrapToMapIfCollection,其他的則使用param1,param2這種,這里用了contains,也就是如果本身命名就有包含param1,param2這種則不會添加
wrapToMapIfCollection
org/apache/ibatis/reflection/ParamNameResolver.java
/** * Wrap to a {@link ParamMap} if object is {@link Collection} or array. * * @param object a parameter object * @param actualParamName an actual parameter name * (If specify a name, set an object to {@link ParamMap} with specified name) * @return a {@link ParamMap} * @since 3.5.5 */ public static Object wrapToMapIfCollection(Object object, String actualParamName) { if (object instanceof Collection) { ParamMap<Object> map = new ParamMap<>(); map.put("collection", object); if (object instanceof List) { map.put("list", object); } Optional.ofNullable(actualParamName).ifPresent(name -> map.put(name, object)); return map; } else if (object != null && object.getClass().isArray()) { ParamMap<Object> map = new ParamMap<>(); map.put("array", object); Optional.ofNullable(actualParamName).ifPresent(name -> map.put(name, object)); return map; } return object; }
wrapToMapIfCollection對于collection類型添加collection,對于list類型還會添加list參數(shù),如果是array類型則會添加array參數(shù),不過這里使用了ifPresent,也就是如果本身參數(shù)名包含了則不會添加
小結
mybatis的ParamNameResolver針對單個參數(shù)沒有加@Param的場景會調(diào)用wrapToMapIfCollection,最多會添加collection、list、array這些參數(shù);其他的則多添加param1,param2這類參數(shù)。
以上就是mybatis的ParamNameResolver參數(shù)名稱解析的詳細內(nèi)容,更多關于mybatis ParamNameResolver的資料請關注腳本之家其它相關文章!
相關文章
使用JPA中@Query 注解實現(xiàn)update 操作方法(必看)
下面小編就為大家?guī)硪黄褂肑PA中@Query 注解實現(xiàn)update 操作方法(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06Jeecg-Boot異常處理'jeecg-boot.QRTZ_LOCKS'?doesn'
這篇文章主要介紹了Jeecg-Boot異常處理'jeecg-boot.QRTZ_LOCKS'?doesn't?exist問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Spring?Lifecycle?和?SmartLifecycle區(qū)別面試精講
這篇文章主要為大家介紹了Spring?Lifecycle和SmartLifecycle的區(qū)別面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10Java中LinkedList數(shù)據(jù)結構的詳細介紹
這篇文章主要介紹了Java中LinkedList,Linked List 是 java.util 包中 Collection 框架的一部分,文中提供了詳細的代碼說明,需要的朋友可以參考下2023-05-05mybatis plus saveBatch方法方法執(zhí)行慢導致接口發(fā)送慢解決分析
這篇文章主要為大家介紹了mybatis plus saveBatch方法導致接口發(fā)送慢解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10