日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MyBatis参数名称解析器-ParamNameResolver解析

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyBatis参数名称解析器-ParamNameResolver解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ParamNameResolver

ParamNameResolver是一個參數名解析器,負責把方法的參數按順序解析出來并進行標注

主要用來處理接口形式的參數,最后會把參數處放在一個map中

map的key為參數的位置,value為參數的名字

?

package org.apache.ibatis.reflection;import org.apache.ibatis.annotations.Param; import org.apache.ibatis.binding.MapperMethod.ParamMap; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds;public class ParamNameResolver {// 通用參數名稱前綴private static final String GENERIC_NAME_PREFIX = "param";// key是索引,value是參數的名稱。// 如果指定了名稱,則從@Param中獲得。如果未指定@Param,則使用參數索引。// 注意,當方法具有特殊參數(如RowBounds或ResultHandler)時,該索引可能與實際索引不同。// Method(@Param("M") int a, @Param("N") int b)轉化為map為{{0, "M"}, {1, "N"}}// Method(int a, int b)轉化為map為{{0, "0"}, {1, "1"}}// Method(int a, RowBounds rb, int b)轉化為map為{{0, "0"}, {2, "1"}}// 有序映射 存儲參數名稱private final SortedMap<Integer, String> names;// 是否使用@Param注解標志private boolean hasParamAnnotation;// 構造方法public ParamNameResolver(Configuration config, Method method) {final Class<?>[] paramTypes = method.getParameterTypes();final Annotation[][] paramAnnotations = method.getParameterAnnotations();final SortedMap<Integer, String> map = new TreeMap<>();int paramCount = paramAnnotations.length;// get names from @Param annotationsfor (int paramIndex = 0; paramIndex < paramCount; paramIndex++) {if (isSpecialParameter(paramTypes[paramIndex])) {// 跳過特殊參數continue;}String name = null;for (Annotation annotation : paramAnnotations[paramIndex]) {if (annotation instanceof Param) {hasParamAnnotation = true;name = ((Param) annotation).value();break;}}if (name == null) {// 沒有指定@Paramif (config.isUseActualParamName()) {name = getActualParamName(method, paramIndex);}if (name == null) {// 使用參數索引作為名稱("0","1",…)name = String.valueOf(map.size());}}map.put(paramIndex, name);}names = Collections.unmodifiableSortedMap(map);}// 獲取實際參數名稱private String getActualParamName(Method method, int paramIndex) {return ParamNameUtil.getParamNames(method).get(paramIndex);}// 是不是特殊參數()private static boolean isSpecialParameter(Class<?> clazz) {return RowBounds.class.isAssignableFrom(clazz) || ResultHandler.class.isAssignableFrom(clazz);}/*** 返回SQL引用的參數名。*/public String[] getNames() {return names.values().toArray(new String[0]);}/*** 返回一個沒有名稱的非特殊參數。* 使用命名規則命名多個參數* 除了默認名稱之外,該方法還添加通用名稱(paraml、param2、...).*/public Object getNamedParams(Object[] args) {final int paramCount = names.size();if (args == null || paramCount == 0) {return null;} else if (!hasParamAnnotation && paramCount == 1) {return args[names.firstKey()];} 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()]);// 添加通用參數名稱(參數、參數 2...)final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1);// /確保沒有覆蓋以@Param命名的參數if (!names.containsValue(genericParamName)) {param.put(genericParamName, args[entry.getKey()]);}i++;}return param;}} }

?

?

?

?

總結

指定@Param情況下

通過@Param("username")的value訪問? 比如#{username}

?

不指定@Param情況下

Java 8 編譯,并且指定-parameters,并且mybatis版本3.4.1及之后版本

可以通過具體的參數變量名來訪問,比如#{username}

@Insert("insert into account(username,phone,createTime) values(#{username},#{phone},#{createTime})") void addAccountNoId22(String username, String phone, Date createTime);

?

不指定指定-parameters

可以通過第1個參數 #{arg0}? 、第2個參數#{arg1},以此類推來訪問

@Insert("insert into account(username,phone,createTime) values(#{arg0},#{arg1},#{arg2})") void addAccountNoId1(String username,String phone,Date createTime);

?

?

只有1個參數情況下

未指定@Param,可以通過任何變量來訪問

@Insert("insert into account(username) values(#{abc})") void addAccountOne(String username);

?

?

指定了@Param,就不能訪問了?

# 注意,本條語句會報錯 @Insert("insert into account(username) values(#{abc})") void addAccountOne1(@Param("username") String username);

?

?

通用

不管哪種模式下,在有多個參數情況下,都可以通過第1個參數#{param1}、第2個參數#{param2},以此類推來訪問

總結

以上是生活随笔為你收集整理的MyBatis参数名称解析器-ParamNameResolver解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。