Mybatis关于JDK动态代理的实现的总结

Mybatis关于JDK动态代理的实现的总结

前言

了解过Java关于JDK的动态代理之后,了解到平常用的Mybatis框架也是基于JDK动态代理实现对数据库的CRUD的,所以上网查资料,其中找到一片写得不错得博客觉得分析得已经很到位,本来想自己写一片文章的,由于自己学识尚浅,所以就索性站在巨人的肩膀上,去进行一个总结,其中有一些晦涩难懂的代码实在是看不懂,所以就放在一边了,希望有长进之后自己可以看得懂。虽然说没能写出一篇分析的文章,但是通过分析和总结之后,自己对Mybatis的底层机制有了一定的了解,起码往知其然也知其所以然的方向去发展了。

建议:在阅读Mybatis关于JDK动态代理的实现的时候,先去了解Java反射和Java关于JDK的动态代理。

内容

Mybatis关于包装Mapper的代码都在org.apache.ibatis.binding 这个包下面,其中有4个类:

MapperRegistry 类是注册Mapper接口与获取代理类实例的工具类。

  • 先执行addMapper函数,也就是先注册Mapper接口到一个map里面,以Mapper接口的type为key,MapperProxyFactory为value。
  • 然后在getMapper的时候,找到Mapper接口类型所对应的MapperProxyFactory对象,然后执行MapperProxyFactory对象的newInstance(SqlSession)函数。

MapperProxyFactory是创建Mapper接口代理对象的工厂类

  • newInstance(SqlSession sqlSession) 则表示创建了MapperProxy对象,MapperProxy实现了JDK动态代理的接口,InvocationHandler

MapperProxy对象在进行执行函数的时候,会回调MapperProxy对象的invoke回调函数

  • 对所需要执行的具体方法进行缓存,缓存到一个map,键是method对象,值是一个MapperMethod对象
  • MapperMethod是对Sqlsession对象的操作封装好的类,所以关于数据库的操作就处于MapperMethod对象中

MapperMethod类中有两个内部类

  1. SqlCommand:封装了SQL标签的类型和具体的执行操作
    • SqlCommand类和底层的CRUD的操作有关。
    • Mybatis框架会把XML配置文件的每一个节点,比如说select,update等等节点生成一个MapperStatment类。要获得这个类,就必须通过SqlSession的Configuration对象的getMapperStatment(String id)来获取,这个ID就是接口的类名+XML文件每一个节点的id属性。
    • 在获得这个MapperStatment对象之后,就可以把SqlCommand的属性进行赋值了。
  2. MethodSignature:封装了方法的参数信息,返回信息
  3. 根据SqlCommand对象和MethodSignature对象的方法和属性,进行一系列的判断就可以通过sqlSession进行对数据库的操作了。

参考

  • https://blog.csdn.net/xiaokang123456kao/article/details/76228684

你可能感兴趣的:(框架理解,Mybatis,JDK动态代理)