Mybatis底层原理分析以及源码阅读

费话不多少先上图,我只喜欢画图分析,看图片:

有两个问题:
问题1: 我们一直在写Mapper/DAO只写了接口,没有写具体的实现吧?

【是的】

问题2: 没有写实现类就没办法实例化执行后续的操作,那么又怎么去访问了数据库,并且拿到了数据呢?

虽说我们没有亲自去写实现类,但是mybatis通过动态字节码技术,也就是动态代理帮我们去生成了代理实现类,比如:我们在UserMapper.java
接口里写了一个insertUser(String username, String passwd, Date
birthday),动态代理会根据这个接口生成具体的实现类,也就是代理了UserMapper.java这个接口,解析参数,然后通过调用SqlSession.select()方法,传入相应的参数,然后由SqlSession去执行后续的操作,比如:调用Executor、StatementHandler等一系列操作。

请先生/公主看源码:

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

注:远程一切的RPC几乎也都是通过代理去实现方法的调用,调用其实就是跨虚拟机同步参数、方法状态的,并不是把另一个虚拟机的方法拿回本地调用哦,还是基于动态代理实现的。

jdk的动态代理大家一定要提前弄清楚,里面源码里面有涉及,程序员使用mybatis就是面向接口的编程,我们在使用时也都是调用接口xxxMapper.java,然后通过唯一namespace匹配到唯一xxxMapper.xml,然后交由mybatis的核心组件执行后续的操作。】
在这里插入图片描述
一条SQL的执行流程是不是很清晰了,还不够清晰的话看看下面的执行链路图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
跟踪链路如下:
在这里插入图片描述

大家在看源码的时候可以从SqlSession入手跟踪,注意Configuration、MappedStatement、StatementHandler之间相互引用的关系,你中有我,我中有你的类与类之间的关系。

相关推荐

  1. MyBatis-RedisCache分析

    2023-12-29 00:50:03       30 阅读
  2. UGUI分析与研究1-UGUI底层的实现原理

    2023-12-29 00:50:03       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-29 00:50:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-29 00:50:03       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-29 00:50:03       87 阅读
  4. Python语言-面向对象

    2023-12-29 00:50:03       96 阅读

热门阅读

  1. Oracle字符串-日期转换

    2023-12-29 00:50:03       47 阅读
  2. centos 安装 qtCreator

    2023-12-29 00:50:03       60 阅读
  3. Android 软键盘的显示和隐藏

    2023-12-29 00:50:03       56 阅读
  4. 如何获取2024年交易日历?

    2023-12-29 00:50:03       62 阅读