myBatis 传递参数源码分析

mybatis 在dao层调用底层方法是通过反射的方式,所以参数其实传递的是一个对象数组。在后期的查询方法调用过程中会将这个对象数组转成map对象(当参数为一个且没有指定@param注解除外
图1方法在org.apache.ibatis.binding.MapperProxy类中,是dao层调用反射的代码
以下方法在org.apache.ibatis.binding.MapperProxy<T>类中,是dao层调用反射的代码
图1
这个方法则明确的指出了调用方法的过程,这里面用到了一个将对象数组转成map对象的方法
这个方法则明确的指出了调用方法的过程,这里面用到了一个将对象数组转成map对象的方法
图2
这个方法可以看出转参数的过程,需要注意的是这个地方在生成map对象的时候,为了向后兼容,参数个数会比传入得参数多,最总的map结果可能是{0=7369, 1=SMITH, param1=7369, param2=SMITH}(注:我传递了两个参数的map结果)这样的
这个方法可以看出转参数的过程,需要注意的是这个地方在生成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值
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值