===============================结合源码,查看Mybatis如何处理入参====================================
1,首先我们的Mapper接口对象是一个代理对象(org.apache.ibatis.binding.MapperProxy<T>,它实现了java提供InvocationHandler接口)
2,被调用的Mapper代理对象的方法,被抽象成为 org.apache.ibatis.binding.MapperMethod 类型的对象,执行其 execute() 方法。它会判断方法的是insert,update,delete还是select。
3,最后调用MapperMethod对象的 convertArgsToSqlCommandParam(args) 方法将入参转换成一个Map。
①获取每个标注了 @Param 注解的参数的param值。然后复制给name。
②每次解析一个参数,给map中保存一个信息(key:参数索引,value:name的值)。
name的值:
标注了@param注解,注解的值。
没有标注:
1,全局配置:useActualParamName(需要jdk 1.8),name=入参参数名。
2,name=map.size();相当于元素的索引。
③如果入参为null,直接返回null。
④如果names只有一个元素,并且没有 @Param 注解。直接names中的一个元素,直接返回。
⑤如果names有多个元素或者有 @Param 注解,遍历names,names集合的value作为key;names集合的key又作为取值的参考args[0]:args[1,"tom"],重新放入一个新的Map对象中。
额外的将一个参数使用新的key:param1...paramN 保存到一个Map对象中。