【mybatis】Mybatis整体架构解析

从本篇开始我们开始学习mybatis的系列源码,主要的主题可能就是四个方面

  • 从整体把握mybatis系统架构
  • 通过一个查询SQL 源码解析核心流程
  • mybatis的缓存机制-源码级别
  • mybatis的插件机制-源码级别
  • spring是如何整合的mybatis框架的

1.整体架构

在这里插入图片描述
上述是mybatis的源码,那么mybatis有哪些核心模块呢,通过从下面三个点出发
在这里插入图片描述

基础支持层

类型转换模块
在mybatis-config.xml配置文件中 通过typeAliase、以及mybaits中JDBC类型和java类型的相关转换。
在这里插入图片描述
日志模块:排查问题,集成了很多优秀的日志框架
反射工具:在java反射的基础上进行了一层封装,为上层使用方提供更加灵活、方便的API接口。
Binding模块:我们无需编写mapper接口的具体实现,而是利用binding模块自动生成mapper接口的动态代理对象。
数据源模块、缓存模块、解析器模块、事务管理模块

核心处理层

核心处理层涉及到mybatis初始化以及执行一条SQL的语句的全流程。
配置解析:将mybatis-config.xml 配置文件 以及mapper.xml配置文件以及mapper接口中的注解信息,解析之后保存到configuration对象中。

SQL解析与scripting模块:根据用户传入的实参,解析动态SQL的标签,形成SQL模版。

SQL执行
在这里插入图片描述
插件 主要提供拓展能力,在原生框架不满足某些场景的时候,可以根据业务场景开发属于自己的工具,比如慢SQL检查等。

接口层

2.造轮子的思路

通过整体上了解mybatis的架构,我们大概了解了实现一个ORM框架需要的核心功能点,如果让我们来实现一个mybatis你有什么思路嘛,我理解大概需要解决如下几个问题

  • 前期准备
    • 1.解析xml配置文件称一个configuration对象,以及解析mapper文件
    • 2.构建核心的基础数据操作对象sqlsession,以及一个mapper文件对应的MappedStatment对象
  • 执行过程
    • 3.通过sqlSession执行对应的mapper文件的sql语句 ,其实也就是Executor、StatmentHandler、ParamerterHandler、ResultSetHandler、TypeHandler 这几个核心类的功能。
    • 说白了就是一个SQL要执行的过程,整体来说就是SQL语句的封装,参数解析,类型转换、结果解析等
  • 生成mapper接口代理类
    • 这部分其实就需要根据原始SQL 进行利用jdk动态代理实现。

3.存储数据类对象

概念:在Java中(JVM)Mybatis相关的配置信息进行封装
   mybatis-config.xml ----> Configuration
   Configuration 
      1. 封装了mybatis-config.xml
      2. 封装了mapper 文件  MappedStatement
      3. 创建Mybatis其他相关的对象 
   XXXDAOMapper.xml ----> MappedStatement(形象的认知,不准确)
  nt对象 
      对应的就是 Mapper文件中的一个一个的 配置标签 
      <select id. -----> MappedStatement
      <insert id. -----> MappedStatement 
      
      注定 一个Mybatis应用中 NMappedStament 对象 
      MappedStatment ---> Configuration 
   
      MappedStatment 中 封装SQL语句 ---> BoundSql

4.操作类对象

2. 操作类对象 (SqlSession) ---> 门面 
    Excutor
      ExcutorMybatis中处理功能的核心
              1. 增删改update  查query
              2. 事务操作 
                 提交 回滚
              3. 缓存相关的操作
      Excutor接口 
           BatchExcutor
               JDBC中批处理的操作, BatchExcutor 
           ReuseExcutor
               目的:复用 Statement 
               insert into t_user(ID,name)values(1,‘孙帅’);
               insert into t_user(ID,name)values(2,‘孙帅1’);
           SimpleExcutor
               常用Excutor Mybatis推荐 默认 
               Configuration protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;
           
    StatmentHandler
       StatementHandlerMybatis封装了JDBC Statement,真正Mybatis进行数据库访问操作的核心
                  功能:增删改差
       StatementHandler接口
                  SimpleStatementHandler
                      JDBC 操作 
                  PreparedStatementHandler
                  CallableStatementHandler 
    
    ParameterHandler
        目的:Mybatis参数 ---JDBC 相关的参数 
             @Param ---> #{} --- > ?
    ResultSetHandler
        目的:对JDBC中查询结果集 ResultSet 进行封装 
        
    TypeHandler
        Java程序操作 数据库
        Java类型   数据库类型
        String    varchar
        int       number
        int       int 

5.串联源码

其实我们可以通过一个简单的SQL就可以了解整体过程。

		// 读取配置配置文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); 
        // 1.解析xml配置文件以及mappers配置文件
        // 2.new DefaultSqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 3.创建DefaultSqlSession对象 
        SqlSession sqlSession = sqlSessionFactory.openSession();
		// 4.生成mapper的代理类对象
        UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
		
		// 5.利用反射执行目标方法
		// 6.根据入参数和结果处理 返回最终的值。
        List<User> users = userDAO.queryAllUsers();

在这里插入图片描述
整体就是这个几个类进行完成的一个SQL的执行。

5.总结

对于优秀的开发人员来说,不仅要能看到代码细节处的优秀设计,而且还能站在更高的角度看整体框架的架构之美,这才是分析一个开源框架更重要的两部分收获。

在这里插入图片描述
在学习一个框架的源码的时候 我理解应该把握几个原则,
1.了解这个框架解决了什么问题 如何使用的
2.掌握核心底层原理,以及掌握后边设计的思想原则。
3.其中对于软件设计模式的使用,借鉴学习
4.如果自己造轮子的话 框架有哪些优缺点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949133.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DDcGAN_多分辨率图像融合的双鉴别条件生成对抗网络_y译文马佳义

摘要&#xff1a; 在本文中&#xff0c;我们提出了一种新的端到端模型&#xff0c;称为双鉴别条件生成对抗网络&#xff08;DDcGAN&#xff09;&#xff0c;用于融合不同分辨率的红外和可见光图像。我们的方法建立了一个生成器和两个鉴别器之间的对抗博弈。生成器的目的是基于特…

K8s高可用集群之Kubernetes集群管理平台、命令补全工具、资源监控工具部署及常用命令

K8s高可用集群之Kubernetes管理平台、补全命令工具、资源监控工具部署及常用命令 1.Kuboard可视化管理平台2.kubectl命令tab补全工具3.MetricsServer资源监控工具4.Kubernetes常用命令 1.Kuboard可视化管理平台 可以选择安装k8s官网的管理平台&#xff1b;我这里是安装的其他开…

计算机网络-数据链路层(CSMA/CD协议,CSMA/CA协议)

2.2 ppp协议 点对点协议ppp是目前使用最广泛的点对点数据链路层协议。 2.3 媒体接入控制基本概念 共享信道要着重考虑的一个问题就是如何协调多个发送和接收站点对一个共享传输媒体的占用&#xff0c;即媒体接入控制MAC。 2.3.1 静态划分信道 频分复用 时分复用 波分复用 码分复…

富芮坤FR800X系列之软件开发工具链(如IDE、编译器、调试器等)

文章目录 一、IDE&#xff08;集成开发环境&#xff09;二、编译器三、调试器四、其他辅助工具五、小结 FR800x系列作为一款低功耗蓝牙芯片&#xff0c;其软件开发工具链对于开发者来说至关重要。以下是对FR800x软件开发工具链的详细介绍&#xff0c;包括IDE&#xff08;集成开…

Oracle数据库如何找到 Top Hard Parsing SQL 语句?

有一个数据库应用程序存在过多的解析问题&#xff0c;因此需要找到产生大量硬解析的主要语句。 什么是硬解析 Oracle数据库中的硬解析&#xff08;Hard Parse&#xff09;是指在执行SQL语句时&#xff0c;数据库需要重新解析该SQL语句&#xff0c;并创建新的执行计划的过程。这…

从零开始开发纯血鸿蒙应用之实现起始页

从零开始开发纯血鸿蒙应用 一、前言二、主要页面三、应用起始页四、MainPageContent 实现1、一级结构2、二级结构2.1、EmptyContent2.2、FileListContent2.2.1、ViewAction&#xff1a;2.2.2、EditAction2.2.3、DeleteAction2.2.4、ShareAction 五、载入起始页的时机五、总结 一…

5G NTN(七) 高层(1)

说明&#xff1a;本专题主要基于3GPP协议38.821 目录 1. Idle态移动性增强 1.1 TA问题 1.1.1 TA的大小 1.1.2 针对NTN LEO的移动TA&#xff0c;场景C2和D2 1.1.3 针对NTN LEO的固定TA&#xff0c;场景C2和D2 1.1.3.1 方法1&#xff1a;当UE位置信息无法获取的时候 1.1.…

Spring Cloud微服务多模块架构:父子工程搭建实践

一、前言 在现代微服务架构中&#xff0c;Spring Cloud 提供了一整套工具和技术栈来简化分布式系统的开发。为了更好地组织和管理复杂的微服务项目&#xff0c;使用 Maven 多模块&#xff08;父子工程&#xff09; 是一种高效的方法。 ‍ 父子工程 是 Maven 中的一种项目结构…

PDF2Audio - 阅读 PDF 的新方式

1000 Stars 127 Forks 10 Issues 0 贡献者 Apache-2.0 License Python 语言 代码: GitHub - lamm-mit/PDF2Audio 更多AI开源软件&#xff1a;AI开源 - 小众AI PDF2Audio&#xff0c;它将彻底改变我们阅读和理解 PDF 文件的方式。我们不再需要盯着屏幕&#xff0c;而是让信息以声…

pdf预览 报:Failed to load module script

pdf 预览报&#xff1a; Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of “application/octet-stream”. Strict MIME type checking is enforced for module scripts per HTML spec. 报错原因&#xff1a…

游戏引擎学习第74天

仓库: https://gitee.com/mrxiao_com/2d_game (仓库满了) gitee 好像一个仓库最多1G https://gitee.com/mrxiao_com/2d_game_2 后面改到https://gitee.com/mrxiao_com/2d_game_2 仓库 代码占的内存不大主要是markdown截图700多兆比较占内存 Blackboard: 以对处理实体对的方式进…

基于等保的安全审计运维系统

摘要 本文研究与设计一种基于等级保护&#xff08;等保&#xff09;要求的安全审计运维系统&#xff0c;以适应日益严峻的网络安全形势和不断提高的安全审计需求。随着信息技术的快速发展和应用广泛&#xff0c;信息系统安全面临的威胁也在不断增加&#xff0c;特别是在关键信…

基于单片机中药存放环境监测系统的实现

基于单片机中药存放环境监测系统的实现 项目开发背景 随着现代中药的广泛应用&#xff0c;中药材的存储环境对其质量有着至关重要的影响。温湿度、烟雾、火灾等环境因素&#xff0c;若不加以控制&#xff0c;将会导致中药材失效或变质。因此&#xff0c;设计一个基于单片机的…

「Java 数据结构全面解读」:从基础到进阶的实战指南

「Java 数据结构全面解读」&#xff1a;从基础到进阶的实战指南 数据结构是程序设计中的核心部分&#xff0c;用于组织和管理数据。Java 提供了丰富的集合框架和工具类&#xff0c;涵盖了常见的数据结构如数组、链表、栈、队列和树等。本文将系统性地介绍这些数据结构的概念、…

webserver的http实现

1、用了状态机&#xff0c;为什么要用状态机&#xff1f; 在逻辑处理模块中&#xff0c;响应的http请求采用主从状态机完成&#xff0c; 传统的控制流程都是按照顺序执行的&#xff0c;状态机能够处理任意顺序的事件&#xff0c;并能提供有意义的响应--即使这些事件发生的顺序和…

Uniapp Android 本地离线打包(详细流程)

一、简介 App 离线 SDK 暂时不支持 Kotlin&#xff0c;未来不清楚。 uniapp 提供了 云打包 与 本地打包 两种方案&#xff0c;云打包 需要排队且还有次数限制&#xff0c;本地打包 则就没有这些限制&#xff0c;而且会 本地打包 对开发 原生插件 有很大的帮助。 细节&#x…

记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)

文章目录 0、总结1、背景2、端倪3、有个微软的系统更新&#xff0c;就想着更新看看&#xff08;能否冲掉问题&#xff09;4、更新没成功&#xff0c;自动重启电脑5、风险文件&#xff08;好家伙命名还挺规范&#xff0c;一看名字就知道出问题了&#xff09;6、开机有一些注册表…

使用大语言模型的生物嵌入,后续应该会有很多类似文章出来!

生信碱移 语言模型嵌入 小编先前分享了使用ChatGPT基因嵌入做平替的顶刊文章GenePT&#xff0c;只需要在原本的领域工作上插入这类的GPT嵌入&#xff0c;就能够实现降维打击。 ▲ 对于GenePT或者嵌入感兴趣的铁子&#xff0c;可以点击查看上面这篇推文。 今天冲浪的时候又看…

如何在没有 iCloud 的情况下将联系人从 iPhone 传输到 iPhone

概括 近期iOS 13.5的更新以及苹果公司发布的iPhone SE在众多iOS用户中引起了不小的轰动。此外&#xff0c;不少变化&#xff0c;如暴露通知 API、Face ID 增强功能以​​及其他在 COVID-19 期间与公共卫生相关的新功能&#xff0c;吸引了 iPhone 用户尝试新 iPhone 并更新到最…

GitLab集成Runner详细版--及注意事项汇总【最佳实践】

一、背景 看到网上很多用户提出的runner问题其实实际都不是问题&#xff0c;不过是因为对runner的一些细节不清楚导致了误解。本文不系统性的介绍GitLab-Runner&#xff0c;因为这类文章写得好的特别多&#xff0c;本文只汇总一些常几的问题/注意事项。旨在让新手少弯路。 二、…