MyBatis源码分析(一)MyBatis整体架构分析

news2025/1/11 6:19:19

文章目录

  • 一、为什么要用MyBatis
    • 1、原始JDBC的痛点
    • 2、Hibernate 和 JPA
    • 3、MyBatis的特点
    • 4、MyBatis整体架构
    • 5、MyBatis主要组件及其相互关系
    • 6、MyBatis源码的特点
  • 二、源码环境搭建
  • 未完待续

一、为什么要用MyBatis

1、原始JDBC的痛点

在传统JDBC场景下,SQL 夹杂在Java代码中耦合度高,导致硬编码内伤。并且维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见,更何况代码冗长,开发效率低。

在这里插入图片描述

工作时间比较长的小伙伴,或者参与过老项目的小伙伴们,对下面的代码肯定不陌生。

Connection conn = null;
try {
    Class.forName("com.mysql.jdbc.Driver");// 加载驱动
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
conn = DriverManager.getConnection("url");
PreparedStatement pst = null;
try {
    conn.setAutoCommit(false);
    pst = conn.prepareStatement("select * from user");
    ResultSet resultSet = pst.executeQuery();
    // 循环操作resultSet获取每行每列的数据。。。。
    conn.commit();
} catch (SQLException e) {
    e.printStackTrace();
    try {
        conn.rollback();
    } catch (SQLException e1) {
        e1.printStackTrace();
    }
} finally {
    try {
        if (pst != null) pst.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

所以,市面上有很多数据库的操作工具,都在尽可能的封装JDBC这一套流程,使开发人员可以更专注于业务开发。

MyBatis也不例外,都绕不开这一套JDBC的操作流程。

2、Hibernate 和 JPA

  • 操作简便,开发效率高
  • 程序中的长难复杂 SQL 需要绕过框架
  • 内部自动生产的 SQL,不容易做特殊优化
  • 基于全映射的全自动框架,大量字段的POJO 进行部分映射时比较困难。
    • 反射操作太多,导致数据库性能下降

3、MyBatis的特点

  • 轻量级,性能出色 SQL 和 Java 编码分开,功能边界清晰。
  • Java代码专注业务、SQL语句专注数据
  • 开发效率稍逊于Hibernate,但是完全能够接受

MyBatis提供的可以自定义复杂sql的机制,可以完美的结合sql优化,应对当前环境数据多查询慢的情况。

所以说,MyBatis 是一个 半自动的ORM(Object Relation Mapping) 框架。

4、MyBatis整体架构

在这里插入图片描述

mybatis架构四层作用:
Api接口层:提供API 增加、删除、修改、查询等接口,通过API接口对数据库进行操作。
数据处理层:主要负责SQL的 查询、解析、执行以及结果映射的处理,主要作用解析sql根据调用请求完成一次数据库操作.
框架支撑层:负责通用基础服务支撑,包含事务管理、连接池管理、缓存管理等共用组件的封装,为上层提供基础服务支撑.
引导层:引导层是配置和启动MyBatis 配置信息的方式

5、MyBatis主要组件及其相互关系

在这里插入图片描述

SqlSession:是Mybatis对外暴露的核心API,提供了对数据库的DRUD操作接口。
Executor:执行器,由SqlSession调用,负责数据库操作以及Mybatis两级缓存的维护
StatementHandler:封装了JDBC Statement操作,负责对Statement的操作,例如PrepareStatement参数的设置以及结果集的处理。
ParameterHandler:是StatementHandler内部一个组件,主要负责对ParameterStatement参数的设置
ResultSetHandler:是StatementHandler内部一个组件,主要负责对ResultSet结果集的处理,封装成目标对象返回
TypeHandler:用于Java类型与JDBC类型之间的数据转换,ParameterHandler和ResultSetHandler会分别使用到它的类型转换功能
MappedStatement:是对Mapper配置文件或Mapper接口方法上通过注解申明SQL的封装
Configuration:Mybatis所有配置都统一由Configuration进行管理,内部由具体对象分别管理各自的小功能模块

6、MyBatis源码的特点

MyBatis的源码不像Spring的源码那样,注释写的并没有很清楚明白。

而且提供的扩展点确实也有限,不过对于开发人员却也是足够了。
所以,很多公司推出了MyBatis-Plus来对MyBatis进行了增强,由于MyBatis的扩展机制较差,MyBatis-Plus几乎所有的扩展点都是对MyBatis源码的复写,而不是通过接口来扩展。

MyBatis源码可以说是略有瑕疵,虽比不上Spring,但是也是目前最好用的ORM框架之一了。

不同版本MyBatis源码可能会稍有不同,但是主流程是差不多的,思想是没有变化的。

二、源码环境搭建

mybatis源码地址:https://github.com/mybatis/mybatis-3

或者根据官方文档,编写测试代码进行测试:https://mybatis.org/mybatis-3/zh/getting-started.html

我们就直接按照官方文档的方式,进行源码分析。

未完待续

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Databend 开源周报第 80 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.com 。Whats New探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。Features & Improvements :…

Unity Asset Bundle学习 - 加载本地资源

Unity的 Asset Bundle 文档 https://docs.unity3d.com/cn/2019.4/Manual/AssetBundles-Workflow.html 第一次接触 直接按官方文档操作 下面接着按文档走流程 构建AssetBundle 此脚本将在 Assets 菜单底部创建一个名为 Build AssetBundles 的菜单项,该菜单项将执行与…

STM32学习笔记-DMA

文章目录一、功能框图通道选择仲裁器FIFO1. **FIFO**: First in First out2. FIFO作用:端口二、DMA模式配置1. 传输模式2. 源地址和目标地址3. 流控制器4. 循环模式5. 传输类型6. 直接模式7. 双缓冲模式8.DMA中断事件三、程序设计1. DMA初始化结构体DMA(Direct Memo…

20 | k8s v1.20集群搭建master和node

1 单节点master 1.1 服务器整体规划 1.2 单Master架构图 1.3 初始化配置 1.3.1 关闭防火墙 systemctl stop firewalld systemctl disable firewalld1.3.2 关闭selinux sed -i s/enforcing/disabled/ /etc/selinux/config # 永久 setenforce 0 # 临时 1.3.3 关闭swap …

tiktok小店如何找到美妆爆品?(内附2月tiktok数据分析)

根据相关数据统计,2023年来全球美妆个护零售总额稳步增长。随着全球化加剧,越来越多的美妆个护品牌选择出海,寻找新的增长和变现机会。Tiktok的快速发展给这些美妆个护品牌提供了新的可能,打通了出海的新思路。同时对于出海的小店…

LeetCode 2373. 矩阵中的局部最大值

LeetCode 2373. 矩阵中的局部最大值 难度:easy\color{Green}{easy}easy 题目描述 给你一个大小为 nxnn x nnxn 的整数矩阵 gridgridgrid 。 生成一个大小为 (n−2)x(n−2)(n - 2) x (n - 2)(n−2)x(n−2) 的整数矩阵 maxLocalmaxLocalmaxLocal ,并满足…

解决Ubuntu虚拟机不能复制粘贴

安装虚拟机的时候就有点不顺,在填写用户名和密码的时候键盘敲不上字,重新又安装了几次才行,安装成功后发现不能复制粘贴主机的内容,这肯定不行啊,找解决方案,网上也有很多,有如下:重…

泰克示波器|MSO64示波器的应用

泰克新一代示波器MSO64为实例来讲解时频域信号分析技术。MSO64采用全新TEK049平台,不仅实现了4通道同时打开时25GS/s的高采样率,而且实现了12-bit高垂直分辨率。同时,由于采用了新型低噪声前端放大ASIC—TEK061,大大降低了噪声水平…

Springboot整合Easy-Es

版本说明 Springboot 2.7.5JDK 17Elasticsearch 7.14.0Easy-Es 1.1.1《点我进入Easy-Es官网》PS&#xff1a;目前Easy-Es暂不支持SpringBoot3.X Windows10安装Elasticsearch 《安装Elasticsearch教程》 pom.xml <parent><groupId>org.springframework.boot<…

SpringBoot集成Swagger3.0(入门)01

创建SpringBoot项目 创建完成后再pom文件中导入swagger3.0依赖&#xff0c;具体的pom文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://w…

一看就懂 —— Spring boot + Spring MVC + MyBatis 基础框架demo

目录 前言 一、项目依赖 二、配置文件 三、创建数据库和实体类 3.1、创建数据库 3.2、创建实体类 四、构建 Mapper 层代码实现&#xff08;接口 XML&#xff09; 4.1、创建接口 4.2、创建 XML 4.3、XML 文件与接口的对应关系 五、实现服务层 六、实现控制器 小结 …

原生JS实现拖拽排序

拖拽&#xff08;这两个字看了几遍已经不认识了&#xff09; 说到拖拽&#xff0c;应用场景不可谓不多。无论是打开电脑还是手机&#xff0c;第一眼望去的界面都是可拖拽的&#xff0c;靠拖拽实现APP或者应用的重新布局&#xff0c;或者拖拽文件进行操作文件。 先看效果图&am…

动态IP与静态ip的区别是什么

1、DHCP IP即动态ip&#xff0c;可以自动获取IP地址。静态ip上网又被称为固定IP地址上网&#xff0c;需要手动设置IP地址。2、在网速上&#xff0c;动态ip和静态ip没有区别。3、动态ip不是一个真实的IP地址&#xff0c;静态IP是可以直接上网的IP地址。静态ip和动态ip设置方法&a…

datahub部署

硬件要求DataHub官方要求的最低配置为&#xff1a;2 个 CPU、8GB RAM、2GB 交换区和 10GB 磁盘空间。本文的示例环境为阿里云centos8云服务器安装dockeryum -y install docker sudo systemctl start docker安装docker-composecurl -SL https://get.daocloud.io/docker/compose…

Python3-列表

Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 Python 有 6 个序列的内置类型&#xff0c;但最常见的是列表和元组。 列表都可以进…

VUE前端常问面试题

文章目录一、VUE前端常问面试题二、文档下载地址一、VUE前端常问面试题 1、MVC和MVVM 区别 MVC&#xff1a;MVC全名是 Model View Controller&#xff0c;即模型-视图-控制器的缩写&#xff0c;一种软件设计典范。 Model(模型)&#xff1a;是用于处理应用程序数据逻辑部分。通…

力扣-第二高的薪水

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道中等的力扣sql练习题。 文章目录前言一、题目&#xff1a;176. 第二高的薪水二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结…

[chapter 11][NR Physical Layer][Layer Mapping]

前言&#xff1a;这里参考Curious Being系列 &#xff0c;简单介绍一下NR 5G 物理层核心技术层映射.我们主要讲了一下what is layer Mapping, why need layer Mapping, how layer Mapping 参考文档&#xff1a;3GPP 38.211- 6.3.1.3 Layer mapping《5G NR Physical Layer | Cha…

仓储调度|库存管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;随着电子商务技术和网络技术的快速发展&#xff0c;现代物流技术也在不断进步。物流技术是指与物流要素活动有关的所有专业技术的总称&#xff0c;包括各种操作方法、管理技能等&#xff0c;物流业采用某些现代信息技术方面的成功经…

智能客服vs人工客服,两者真水火不容?

随着互联网、智能技术的不断发展&#xff0c;Chatgpt的到来引发各界热议&#xff0c;不少人认为Chatgpt将给各个领域带来翻天覆地的变化。而在客服行业&#xff0c;AI产物——智能客服早已落地并且被广泛运用&#xff0c;在Chatgpt爆火的这段时间&#xff0c;有望率先融合应用C…