mybatis 在dao层调用底层方法是通过反射的方式,所以参数其实传递的是一个对象数组。在后期的查询方法调用过程中会将这个对象数组转成map对象(当参数为一个且没有指定@param注解除外)
图1方法在org.apache.ibatis.binding.MapperProxy类中,是dao层调用反射的代码
图1
这个方法则明确的指出了调用方法的过程,这里面用到了一个将对象数组转成map对象的方法
图2
这个方法可以看出转参数的过程,需要注意的是这个地方在生成map对象的时候,为了向后兼容,参数个数会比传入得参数多,最总的map结果可能是{0=7369, 1=SMITH, param1=7369, param2=SMITH}(注:我传递了两个参数的map结果)这样的
图3
通过第三张图可以看出,当参数个数为一个的时候,且没有指定@Param注解的,mybitis会直接取方法中的参数作为方法入参,所以此时传递的是一个Object对象,除此之外都是通过生成map对象传递的,其次在生成map对象时用到了params,params其实是一个SortedMap,定义在一个叫MethodSignature的静态类中的,在MethodSignature的构造器中会通过一个getParams()的方法初始化该参数。该方法需要传递两个参数,一个是需要反射的方法,一个是是否有指定@param注解的Boolean值