阿里 p8 私藏 MyBatis 笔记,从入门到精通,纵享源码细节

news2024/9/23 1:40:41

前言

越来越多的企业已经将 MyBatis 使用到了正式的生产环境,我认为流行的原因就在于绝大部分项目都是面向表结构编程的,把 Java 对象仅当成数据容器,查询和模型变更都设计在一张表上,所谓业务逻辑就是一堆增删改查的 sql 集合,因此 Mybatis 用起来非常方便。

为什么要学 MyBatis?

除了我上面说的目前 MyBatis 在国内非常流行外,还有以下几点:

①学好 MyBatis 能很好地帮助我们解决数据层开发的问题;

MyBatis 源码中有很多设计模式和并发编程的技巧,学好源码对提升编码能力有很大的帮助;

③最后,Mybatis 源码也是大厂面试的经常问的点。

基于上述情况,本次将给大家分享阿里 p8 私藏 MyBatis 笔记,帮助大家由浅入深地学习 MyBatis 相关知识,纵享源码细节,让开发者不仅知其然更知其所以然

本文分为两部分,但是我想反套路来一波,首先给大家展示一下源码,再展示 MyBatis 整体学习内容,不多 bb,直接上了。

A:精进 MyBatis 源码分析 - 整体架构

①整体架构

  • 项目结构

  • 整体架构

  • 基础支持层

  • 核心处理层

  • 接口层

B:精进 MyBatis 源码分析 - 基础支持层

①基础支持层

  • 解析器模块

  • 反射模块

  • 异常模块

  • 数据源模块

  • 事务模块

  • 缓存模块

  • 类型模块

  • IO 模块

  • 日志模块

  • 注解模块

  • Binding 模块

C:精进 MyBatis 源码分析 - MyBatis 初始化(一)之加载 mybatis-config.xml

①MyBatis 的初始化

②初始化(一)之加载 mybatis-config.xml

  • SqlSessionFactoryBuilder

  • XMLConfigBuilder

  • Configuration

D:精进 MyBatis 源码分析 - MyBatis 初始化(二)之加载 Mapper 接口与 XML 映射文件

①MyBatis 的初始化

②初始化(二)之加载 Mapper 接口与映射文件

  • 解析入口

  • MapperAnnotationBuilder

  • XMLMapperBuilder

  • XMLStatementBuilder

  • MapperBuilderAssistant

  • RequestMapping

  • ResultMap

  • MappedStatement

E:精进 MyBatis 源码分析 - MyBatis 初始化(三)之 SQL 初始化(上)

①MyBatis 的初始化

②初始化(三)之 SQL 初始化(上)

  • LanguageDriver

  • XMLScriptBuilder

  • NodeHandler

  • DynamicContext

  • SqlNode

  • OgnlCache

F:精进 MyBatis 源码分析 - MyBatis 初始化(四)之 SQL 初始化(下)

①MyBatis 的初始化

②初始化(四)之 SQL 初始化(下)

  • SqlSourceBuilder

  • ParameterExpression

  • ParameterMapping

  • SqlSource

  • BoundSql

  • DefaultParameterHandler

G:精尽 MyBatis 源码分析 - SQL 执行过程(一)之 Executor

①MyBatis 的 SQL 执行过程

②SQL 执行过程(一)之 Executor

  • Executor

  • BaseExecutor

  • SimpleExecutor

  • ReuseExecutor

  • BatchExecutor

  • 二级缓存

  • Executor 在哪被创建

H:精尽 MyBatis 源码分析 - SQL 执行过程(二)之 StatementHandler

①MyBatis 的 SQL 执行过程

②SQL 执行过程(二)之 StatementHandler

  • StatementHandler

  • RoutingStatementHandler

  • BaseStatementHandler

  • SimpleStatementHandler

  • PreparedStatementHandler

  • CallableStatementHandler

  • KeyGenerator

  • Jdbc3KeyGenerator

  • SelectKeyGenerator

  • NoKeyGenerator

I:精尽 MyBatis 源码分析 - SQL 执行过程(三)之 ResultSetHandler

①MyBatis 的 SQL 执行过程

②SQL 执行过程(三)之 ResultSetHandler

  • ResultSetWrapper

  • ResultSetHandler

  • DefaultResultSetHandler

J:精尽 MyBatis 源码分析 - SQL 执行过程(四)之延迟加载

①MyBatis 的 SQL 执行过程

②SQL 执行过程(四)之延迟加载

  • ResultLoader

  • ResultExtractor

  • ResultLoaderMap

  • ProxyFactory

  • JavassistProxyFactory

  • CglibProxyFactory

K:精尽 MyBatis 源码分析 - SqlSession 会话与 SQL 执行入口

①SqlSession 会话与 SQL 执行入口

  • SqlSessionFactoryBuilder

  • DefaultSqlSessionFactory

  • DefaultSqlSession

  • MapperMethod

O:精尽 MyBatis 源码分析 - 插件机制

①插件机制

  • 植入插件逻辑

  • 分页插件示例

  • Interceptor

  • Invocation

  • Plugin

  • InterceptorChain

P:精尽 MyBatis 源码分析 - MyBatis-Spring 源码分析

①配置示例

②SqlSessionFactoryBean

③MapperFactoryBean

④SqlSessionDaoSupport

⑤MapperScannerConfigurer

⑥ClassPathMapperScanner

⑦@MapperScan 注解

⑧自定义 <mybatis:scan /> 标签

⑨SqlSessionTemplate

⑩SqlSessionHolder

⑪SqlSessionUtils

⑫SqlSessionSynchronization

Q:精尽 MyBatis 源码分析 - Spring-Boot-Starter 源码分析

①配置示例

②MybatisProperties

③SpringBootVFS

④MybatisAutoConfiguration

⑤构造方法

  • afterPropertiesSet 方法

  • sqlSessionFactory 方法

  • sqlSessionTemplate 方法

  • MapperScannerRegistrarNotFoundConfiguration

  • AutoConfiguredMapperScannerRegistrar

⑥spring.factories 文件

A:MyBatis 快速入门

  • 为什么需要 ORM 框架?

  • MyBatis 快速入门

B:MyBatis 开发要点

轻松掌握要点,你将清楚地知道:

①到底是 resultType 还是 resultMap?

②如何传递多个参数?

③如何获取主键?

④了解 SQL 元素和 SQL 的参数,动态 SQL,代码生成器,关联查询,缓存等知识。

C:MyBatis 源码概述

初探源码,为以后深入学习 MyBatis 源码做好铺垫,从这里你将学习到:

①怎么下载 MyBatis 源码

②源码架构分析

③外观模式(门面模式)

④面向对象设计需要遵循的六大设计原则

D:日志模块分析

MyBatis 没有提供日志的实现类,需要接入第三方的日志组件,但第三方日志组件都有各自的 Log 级别,且各不相同,而 MyBatis 统一提供了 trace、debug、warn、error 四个级别。

因此,你需要掌握以下 5 点:

①日志模块需求分析

②适配器模式

③怎么实现优先加载日志组件?

④代理模式和动态代理

⑤优雅的增强日志功能

E:数据源模块分析

数据源模块重点讲解数据源的创建和数据库连接池的源码分析;数据源创建比较复杂,对于复杂对象的创建,可以考虑使用工厂模式来优化。

这个章节,主要会介绍以下 4 点:

①简单工厂模式

②工厂模式

③数据源的创建

④数据库连接池技术解析

F:缓存模块分析

①MyBatis 缓存模块需满足如下需求:

  • MyBatis 缓存的实现是基于 Map 的,从缓存里面读写数据是缓存模块的核心基础功能;

  • 除核心功能之外,有很多额外的附加功能,如:防止缓存击穿,添加缓存清空策略(fifo、lru)、序列化功能、日志能力、定时清空能力等;

  • 附加功能可以以任意的组合附加到核心基础功能之上。

基于 Map 核心缓存能力,将阻塞、清空策略、序列化、日志等等能力以任意组合的方式优雅的增强是 Mybatis 缓存模块实现最大的难题,用动态代理或者继承的方式扩展多种附加能力的传统方式存在以下问题:

这些方式是静态的,用户不能控制增加行为的方式和时机;另外,新功能的存在多种组合,使用继承可能导致大量子类存在。综上,MyBtis 缓存模块采用了装饰器模式实现了缓存模块。

②装饰器模式

③装饰器在缓存模块的使用

④缓存的唯一标识 CacheKey

G:反射模块分析以及 MyBatis 流程

第一阶段:配置加载阶段

①建造者模式

  • 什么是建造者模式

  • 与工厂模式区别

②配置加载的核心类

  • 建造器三个核心类

  • 关于 Configuration 对象

③配置加载过程

 

第二阶段:代理封装阶段

①Mybatis 的接口层

  • SqlSession

  • 策略模式

  • SqlSessionFactory

②binding 模块分析

  • binding 模块核心类

  • binding 模块运行流程

第三个阶段:数据访问阶段

①关于 Executor 组件

②Executor 中的模板模式

③Executor 的三个重要小弟

④关于 StatementHandler

⑤关于 ResultHandler

与 spring 结合原理

①MyBatis-Spring 是什么

②MyBatis-Spring 集成配置最佳实践

③MyBatis-Spring 集成原理分析

插件开发

①理解插件

②插件开发快速入门

③责任链模式

④插件模块源码分析

资料已整理成文档,需要获取的小伙伴可以直接转发+关注后私信(学习)即可获取哦

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

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

相关文章

Cadence Allegro PCB设计88问解析(二十一) 之 Allegro中更新器件封装(Footprint)

一个学习信号完整性仿真的layout工程师 今天和大家简单介绍Allegro中如何更新PCB封装&#xff0c;在我们导入原理图网表&#xff0c;PCB的封装是必不可少的&#xff0c;但是可能有些为了前期布局评审&#xff0c;有的封装是临时的&#xff0c;那么就需要后续更新正确的封装。下…

02 Java起步

目录 第一章&#xff1a;注释 1.1 概述 1.2 Java 中的注释 第二章&#xff1a;关键字 2.1 概述 2.2 Java 中的关键字 第三章&#xff1a;标识符 3.1 概述 3.2 标识符的命名规则&#xff08;必须遵守&#xff09; 3.3 标识符的命名规范 第四章&#xff1a;数据类型以…

第十四届蓝桥杯集训——JavaC组首篇——环境搭建(win10)

还有9天就截止报名了&#xff0c;我们也算正式开始培训了&#xff0c;今年希望能取得更好的成绩。 今年的蓝桥杯从环境开始——本博客为win10电脑的Java_JDK环境搭建&#xff1a; 学生机环境-Java编程环境&#xff08;第十四届大赛&#xff09; 链接: https://pan.baidu.com…

软件测试行业真的饱和了吗?一线大厂年薪100W的测开岗位还很缺人!

在一线大厂&#xff0c;没有测试这个岗位&#xff0c;只有测开这个岗位。这几年&#xff0c;各互联网大厂技术高速更新迭代&#xff0c;软件测试行业也正处于转型期。传统的功能测试技术逐步淘汰&#xff0c;各种新的测试技术层出不穷&#xff0c;测试人员的薪资也水涨船高。与…

【Docker】基础

文章目录Docker什么是Docker虚拟机和容器Docker 底层原理Docker 优点关键技术Docker 推荐视频课程配套食用&#xff1a;https://www.bilibili.com/video/BV1gr4y1U7CY/?vd_source6d95a05fa9867baaa8ea7c5c52faf4e6 什么是Docker Docker&#xff0c;容器虚拟化技术&#xff…

从浪潮登顶NuScenes榜首解读自动驾驶AI感知技术的发展

导读&#xff1a; “自动驾驶是集感知、决策、交互于一体的技术 环境感知能力作为自动驾驶的第一个环节&#xff0c;是车辆与环境交互的纽带 通过“摄像头、毫米波雷达、超声波雷达、激光雷达”等各类传感器设备&#xff0c;感知环境的手段日趋多元化 同时&#xff0c;在平…

STM32 EXT for GPIO

EXT 描述&#xff1a; EXTI&#xff08;中断/事件控制器&#xff09;包括20个相互独立的边沿检测电路并且能够向处理器内核产生中断 请求或唤醒事件。EXTI有三种触发类型&#xff1a;上升沿触发、下降沿触发和任意沿触发。EXTI中的每 一个边沿检测电路都可以独立配置和屏蔽 E…

java-文件上传-excel存入数据库全代码及流程(附前端代码)

今天给大家带来的是文件上传中比较常用的&#xff0c;上传excel文件&#xff0c;将表格中的数据存入数据库中的一个转化的工具类&#xff1b;大致的流程是&#xff1a;前端点击上传按钮-->选择需要上传的excel表格-->确认上传--> 文件传到后台-->后台处理file文…

[附源码]计算机毕业设计酒店在线预约咨询小程序Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

解决穿山甲Gromore广告在Oppo上报广告病毒Android.Virus.AdCheat.AdCut.A

描述 在上架Oppo的时候审核打回了发现了病毒。提示如下&#xff1a; 自动化检测“安全”项未通过,病毒名称&#xff1a;Android.Virus.AdCheat.AdCut.A,病毒描述&#xff1a;该病毒安装启动后&#xff0c;会展示非官方广告&#xff0c;造成盗源消耗和信息泄露&#xff0c;请卸…

[附源码]Python计算机毕业设计Django行程规划app

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

JUC07-ConcurrentHashMap

一、HashMap中的死链问题 多个线程对hashmap进行扩容时需要将原有数据转移到新的table数组中&#xff0c;这个过程中会重新计算每个元素对应的数组下标从而改变元素的next指针&#xff0c;而另一个线程重复对该链表进行迁移时可能会导致循环链表的产生 原始链表&#xff0c;格…

虹科案例 | 利用激光测距传感器进行锯齿定位

PART ONE 应用描述 在这项应用中&#xff0c;两个激光测距传感器分别安装在一个凸出部分的末端的两侧&#xff0c;用以测量其两侧到锯齿的距离的差。一个微型控制器会按照预设&#xff0c;记录测量数据并提供一个方便快捷的前后位置校准的图像&#xff0c;以便检查。当操作者触…

通过图卷积网络从单词语义学习到句子句法,用于基于方面的情感分析

Learning from word semantics to sentence syntax by graph convolutional networks for aspect-based sentiment analysis 1.Introduction 据我们所知&#xff0c;NLP 的基本动机是训练计算机处理明显属于人类的文本 。也就是说&#xff0c;在当前方法中整合语义信息和句法…

配音app开发,创建专属声音作品

娱乐生活的增加让人们开始向配音方面涉猎&#xff0c;配音逐渐变得大众化。配音对于专业性要求并不高&#xff0c;任何一个对配音有兴趣的用户都可以对自己喜欢的影视剧进行配音&#xff0c;同一个片段不同人在配音时所带的情感不同&#xff0c;最终呈现的听觉效果也不同&#…

VS Code 新增自定义字体

这里以 JetBrainsMono 字体为例 1、下载好字体文件安装 2、安装完成后进入系统字体文件夹 C:\Windows\Fonts 找到刚刚安装好的字体&#xff0c;复制字体文件名&#xff1a;JetBrains Mono NL 3、打开 VS Code 软件&#xff0c;依次点击左下角设置按钮 —> 常用设置 —>…

圣诞节教你如何用Html+JS+CSS绘制3D动画圣诞树

上篇文章给大家提供了一个如何生成静态圣诞树的demo。但是那样还不够高级&#xff0c;如何高级起来&#xff0c;当然是3D立体带动画效果了。 先看效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html lang"en" > <head> <meta c…

Git实战(五)| 让工作更高效,搞定Git的分支管理

上一篇讲到Git的分支管理实操&#xff0c;在线合并和本地合并都进行了实操。毕竟&#xff1a;光说不练是假把式。而只练不整理&#xff0c;只能是傻把式了。分支管理到底如何进行管理呢&#xff1f; 先以GitLab上的一张经典的图打头&#xff0c;作为一个总体概览&#xff0c;也…

数据合规圈必读!《数据合规:实务、技术与法律解码》新书发布!算力智库创始人燕丽盈科律所刘磊联袂著作

今年10月&#xff0c;上海网信办某科技公司因处理政务类数据时违规操作&#xff0c;被责令整改&#xff0c;并处以五万元罚款。 今年7月26日&#xff0c;广州市在净网“2022”专项行动中&#xff0c;某技术公司一款APP系统因未履行数据安全保护义务&#xff0c;导致1000万余条…

ubuntu 20.04 设置DNS

ubuntu 20.04 设置DNSubuntu 20.04 设置DNS 快捷步骤下面是命令解释1、决定系统dns的文件是/etc/resolv.conf2、谁能影响/etc/resolv.conf3、/etc/resolv.conf软链接到/run/systemd/resolve/resolv.confubuntu 20.04 设置DNS 快捷步骤 修改 /etc/systemd/resolved.conf 文件&a…