MyBatis接口方法中可以接收各种各样的参数,MyBatis底层对于这些参数进行不同的封装处理方式
1.单个参数
① POJO类型:直接使用,属性名和参数占位符名称一致
② Map集合:直接使用,键名和参数占位符名称一致
③ Collection:封装为map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put(“arg0”,collection集合)
map.put(“collection”,collection集合)
④ List:封装为map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put(“arg0”,list集合)
map.put(“collection”,list集合)
map.put(“list”,list集合)
⑤ Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put(“arg0”,数组)
map.put(“array”,数组)
⑥ 其他类型:直接使用
2.多个参数:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put(“arg0”,参数值1)
map.put(“param1”,参数值1)
map.put(“arg1”,参数值2)
map.put(“arg1”,参数值2)
MyBatis提供了ParamNameResolver类进行参数封装
ParamNameResolver中getNamedParams(Object[] args)
public Object getNamedParams(Object[] args) {
int paramCount = this.names.size();
if (args != null && paramCount != 0) {
if (!this.hasParamAnnotation && paramCount == 1) {
Object value = args[(Integer)this.names.firstKey()];
return wrapToMapIfCollection(value, this.useActualParamName ? (String)this.names.get(0) : null);
} else {
Map<String, Object> param = new ParamMap();
int i = 0;
for(Iterator var5 = this.names.entrySet().iterator(); var5.hasNext(); ++i) {
Entry<Integer, String> entry = (Entry)var5.next();
param.put(entry.getValue(), args[(Integer)entry.getKey()]);
String genericParamName = "param" + (i + 1);
if (!this.names.containsValue(genericParamName)) {
param.put(genericParamName, args[(Integer)entry.getKey()]);
}
}
return param;
}
} else {
return null;
}
}
建议:使用@Param注解来修改Map集合中默认的键名,并使用修改后的名称来获取值,这样可读性更高