Mybatis参数处理过程
测试类
1 | public class MybatisTest { |
mapper
1 | public interface TestMapper { |
mapper映射
1 | <?xml version="1.0" encoding="UTF-8" ?> |
源码分析
1 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { |
代理对象(MapperProxy)调用invoke()
1 | public Object getNamedParams(Object[] args) { |
这里是进行参数的处理,其中names是一个map:{“0”=arg0},它是在构造函数中初始化的。代码如下
1 | public ParamNameResolver(Configuration config, Method method) { |
当参数没有@Param注解时,names = {“0”=arg0,”1”=arg1,”2”=arg2…}
当参数有@Param注解时,names = {“0”=参数值1,”1”=参数值2…}
两个都有时,names = {“0”=arg0,”1”=arg1,”2”=参数值2..}
得到了names之后,就继续看getNamedParams
- 没有参数,直接返回null
- 如果只有一个参数,而且没有用@Param注解,就直接返回
- 多个参数,最终结果如下
param={“arg0”=参数值1,”arg1”=参数值2,”param1” = 参数值1,”param2” = 参数值2} (这是不带@Param注解的)
param={“@Param的value值1”=参数值1,”@Param的value值2”=参数值2,”param1” = 参数值1,”param2” = 参数值2} (这是带@Param注解的)
所以当有多个参数时,mapper映射文件中就不可以直接用#{}来获取参数,因为参数都被封装为一个map了,需要根据封装后的map的key来获取参数