【自用】getMapper解析

来了,终于来了,大活来了,虽然只有20分钟,但我觉得我要花一个小时。我终于要把源码翻过去了,只要看完这节讠

这是那个核心代码吗?

在这里插入图片描述

点开这个new MapperProxy

他直接显示的声明了,不是匿名内部类

在这里插入图片描述

他重写了invoke!! 还可以重写这个??

。。这就是学完了代码,不敲的后果,Invoke就是用来重写的

在这里插入图片描述

 return Object.class.equals(method.getDeclaringClass()) ? 
 method.invoke(this, args) 
 : this.cachedInvoker(method).invoke(proxy, method, args, this.sqlSession)

上面那个是代码更新了的版本,老师这个是旧版的

在这里插入图片描述

走了上面这行,看我标记的黑色箭头,就是实例化了代理对象

在这里插入图片描述
在这里插入图片描述

 return Proxy.newProxyInstance(this.mapperInterface.getClassLoader(), new Class[]{this.mapperInterface}, mapperProxy);

mapperProxy应该是invocation那个才对,我看看

没错,就是个invacation什么的

在这里插入图片描述

所以最终返回的这个mapper 其实是个代理对象

准确的说是SysroleMapper 的代理对象

在这里插入图片描述

不一样的地方是,他没有被代理对象,还可以这么用的吗,真灵活!!!

在这里插入图片描述

调用这个代理方法,看看它进入到哪里去

在这里插入图片描述

说是应该进入这个方法

在这里插入图片描述

就是这个invoke

在这里插入图片描述

因为这个代理对象,持有了这个incovationHandle 对象

在这里插入图片描述

有点懂了,这个incovationHandle 里面其实可以不执行被代理的对象方法的,因为之前是判断是不是之前的我不需要的方法。
就是mybatis的动态代理类,其实想走的是这个方法
重写的这个方法,是干什么的啊?

在这里插入图片描述

好复杂啊,那个proxy的形参,就是外面传进来的session这个实参

在这里插入图片描述
在这里插入图片描述

这个session里的东西好多啊

在这里插入图片描述

我忘了,这个对象,是啥了

是被代理对象,这里它没有被代理,给他当成代理了

在这里插入图片描述

类加载器

Classloader 类加载器,用来加载Java类到 Java 虚拟机中的一种加载器。

我不行了,快往下捋把,细节问题再说

method.getDeclaringClass()得到方法所在的类

在这里插入图片描述

这个判断的意思是,如果你执行的代码是object里面的方法

toString() hasjCode equels

在这里插入图片描述

比如调的是这个方法,就会进上面的方法

在这里插入图片描述

往下的执行步骤

1、去缓存里面找方法在这里插入图片描述

看看这个里面在做什么

这行代码得到一个 MapperMethod 就是映射方法对象把

在这里插入图片描述

method是个对象

在这里插入图片描述

F7进去

在这里插入图片描述

看看MapperMethod这个方法在干什么

在这里插入图片描述

我的方法和老师的方法,已经不一样了

在这里插入图片描述

我的是这样的

在这里插入图片描述

我看了一眼,方法确实不一样了,先安老师的来吧

好了,继续捋

看看MapperMethod这个方法在干什么

在这里插入图片描述

把我们的method封装到了一个叫做MapperMethod的方法里了

在这里插入图片描述

接着看里面在干什么

在这里插入图片描述

确实是个内部类,看看再干什么

在这里插入图片描述

好像是原始的那种 不用getMapper的方法

在这里插入图片描述
在这里插入图片描述

判断configurration 里面有没有这个 方法

在这里插入图片描述

这个东西之前存进去了

在这里插入图片描述
在这里插入图片描述

继续那个判断

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

包含这个,之前build的时候已经存进去了

在这里插入图片描述

得到一个mapperState对象

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

终于走完了这个方法,存进去了
就是缓存了一下这个方法

在这里插入图片描述

所以映射文件这里需要是接口名和方法名

在这里插入图片描述

在这里插入图片描述

在运行的时候,他根据配置文件里面的接口名和方法 名 拼了个字符串
解析的时候就能找到这个方法了,是这么设计好的

在这里插入图片描述

去执行这个方法

在这里插入图片描述

2、进execute方法

在这里插入图片描述

看看execute方法,mybatis用动态代理,就是为了执行这个方法吧

在这里插入图片描述

这里判断这个方法是不是无返回值的 return void void 无效的

在这里插入图片描述

有返回值的

在这里插入图片描述

再去判断是不是returnMany

在这里插入图片描述

怎么判断的

直接去configuration里面取值了,说明之前已经判断过了

在这里插入图片描述

判断是不是集合 是不是数组

在这里插入图片描述

他是怎么判断是不是集合的
isAssignavleFrom 用来判断,这个类type 是不是Collection(集合)的子类

在这里插入图片描述

判断是不是数组
jdk里面原生的东西,暂时看不了,本地方法

在这里插入图片描述

就算他是many在的是这个方法
他就去调用自己的selectList方法,妈的整了半天就是封装了自己之前的selectOne 什么寄吧东西

在这里插入图片描述

是不是map也是这么弄得

在这里插入图片描述

走sqlSession的selectMap方法

在这里插入图片描述

是不是游标查询
老师说这个方法早就淘汰了

在这里插入图片描述

最后走到了这里面
convertArgsToSqlCommandParam == 转换参数到sql命令指令需要的参数格式== 你看这名字起的多好 啊

在这里插入图片描述

转换这个

在这里插入图片描述

配置文件之前有的paramType 这个,这个里面没有,意思一下,反正我懂
因为这里是一个简单的string所以不用转

在这里插入图片描述

这个转换方法相当NB

在这里插入图片描述

在这里插入图片描述

简单说明一下这个方法的实现

1、如果你的参数没有注解,并且参数只有一个

在这里插入图片描述

就简单的放到这里面了 Object 数组

在这里插入图片描述

this.name.firstKey 是什么,老师没讲,我大概看了一眼,好像是map里面的一个key

在这里插入图片描述

SortedMap 是一个map

在这里插入图片描述

2、如果你的参数有注解,并且参数不止有一个

否则new 了一个paramMap

在这里插入图片描述

这个paramMap 好像是他自己定义的的一个hashMap子类

在这里插入图片描述

所以他底层,帮我们把参数封装成了map

在这里插入图片描述

param0 param1 还记的这个吗,如果没用注解指定,可以直接用这个来着

在这里插入图片描述

我的那个方法 参数是 String 所以不需要转换

在这里插入图片描述

getname的值

就是命名空间加方法名

在这里插入图片描述

至于selectOne 怎么执行的,这个就有点深了

老师进的是红框下面的方法,里面至少有八九层,我的妈啊吗,唉,我真是个彩笔

在这里插入图片描述

总结一下,核心就是

理解getMapper

就是封装了selectone list 什么的方法

拿到了getMapper,返回了一个代理对象

拿到了代理对象执行了对应方法的过程

我还有一个问题,为什么他要是用动态代理模式来做呢?

我想想,如果不用动态代理,那他该怎么做呢?

好像是为了实现这个

在这里插入图片描述

在这里插入图片描述
使用动态代理,就是为了分流这个方法吧,如果我直接用invoke的话,会是什么情况呢?

如果直接invoke就不能区分 selectone 还有 selectList 这些方法了吧
应该吧

如果直接invoke的话

啊,使用动态代理是为了使用那个大反射,大反射是为了干什么来着

动态代理就是静态代理的加强版

静态代理是因为对原来的方法不满意进行扩展的,但是他也没有 被代理的对象啊

总结一下吧:我自己的理解,不用动态代理的方法也能做,就是几个if判断罢了,但是使用动态代理的话,更加专业,就像mvc分层一样,更加有逻辑之类的把

看来代理被代理不仅能扩展程序

还能起到分发方法去其他方法执行的作用(selectOne selectList)

比如,我只是假如啊,这个并不合理:发送数据到jsp和发送数据到vue之类的,算了,我大概自己懂就好了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值