3.MyBatis源码解析-CRUD执行流程--阿呆中二

2024-09-07 10:58

本文主要是介绍3.MyBatis源码解析-CRUD执行流程--阿呆中二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CRUD执行流程

  • MyBatis
    • CRUD执行流程
    • 与我联系

MyBatis

本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程SqlSession构建流程CRUD执行流程MyBatis扩展点,以及针对面试题进行源码分析。

mybatis 3.x源码深度解析与最佳实践下载:https://download.csdn.net/download/u013425841/12816685

CRUD执行流程

MyBatis执行的基本流程大致可以分四个步骤:

  1. 使用Resources类加载Mybatis的Xml配置文件
  2. 使用SqlSessionFactoryBuilder构建SqlSessionFactory对象
  3. 使用SqlSessionFactory对象调用openSession获取SqlSession
  4. 使用SqlSessioon对象调用select\update\delete等方法进行操作
public static void main(String[] args) {try {Reader reader;// 1.加载mybatis configuration配置文件String resource = "Configuration.xml";reader = Resources.getResourceAsReader(resource);// 2.使用SqlSessionFactoryBuilder构建SqlSessionFactory对象SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);// 3.构建SqlSession对象SqlSession session = sessionFactory.openSession();try {//4.执行数据库查询User user = (User) session.selectOne("com.mybatis.source.mapper.UserMapper.getUser", 1);System.out.println(user.getAge() + "," + user.getName());} finally {session.close();}} catch (IOException e) {e.printStackTrace();}

今天重点分析CRUD执行流程,主要对应代码

        //第一种方式 直接使用selectOne方法User user = session.selectOne("com.mybatis.source.mapper.UserMapper.getUser", 1);//第二种方式 使用动态代理最终还是调用session提供的方法,比如selectOneUserMapper mapper = session.getMapper(UserMapper.class);//mapper是已经被代理的类,所以执行的时候会被动态代理拦截,最终调用selectOneUser user3 = mapper.getUser(1);

因为getMapper最终还会调用到selectOne方法,因此我们分析第二种getMapper方式。

进入源码分析:

	UserMapper mapper = session.getMapper(UserMapper.class);

在这里插入图片描述
1.getMapper方法首先从knownMappers对象中,获取当前传入的Class对应的MapperProxyFactory工厂类
注意:knowMappers的内容是在解析XML过程中,我们有提到的一个步骤,是在进行addMapper的时候进行put操作的,创建了一个mapper的代理工厂
在这里插入图片描述

2.调用newInstance方法生成代理类,MapperProxy负责具体代理后的逻辑处理
在这里插入图片描述
上面就返回Mapper的代理类,下面继续看执行流程:

User user3 = mapper.getUser(1);

1.上面已经知道mapper是代理类,并且知道代理的主要逻辑在MapperProxy中

因此执行getUser会执行MapperProxy中的invoke方法,invoke方法调用cachedInvoker方法,返回一个PlainMethodInvoker方法
在这里插入图片描述

2.拿到PlainMethodInvoker对象执行invoke方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面可以看出最终还会委托sqlSession对象,执行selectOne等操作,到此继续执行就和第一种逻辑开始一致。

继续看sqlSession.selectOne方法执行逻辑:
在这里插入图片描述
可以看到委托给selectList方法
在这里插入图片描述
可以看到使用当时解析好的执行器进行查询
在这里插入图片描述
本文使用的SimpleExecutor,query的实现是继承BaseExecutor类的query方法,执行器都继承这个类,公用部分在BaseExecutor里

可以看到这里进行一级缓存和调用queryFromDataBase进行底层jdbc的操作
在这里插入图片描述
queryFromDataBase方法,具体doQuery实现在子类
在这里插入图片描述
看看SimpleExecutor执行器的doQuery方法,执行jdbc操作,并且封装返回结果
在这里插入图片描述
大致的执行流程就是这样,如果有需要更详细的内容,可以留言反馈哈

在这里插入图片描述

与我联系

Java/一对一零基础辅导/公司项目一对一辅导/日常Bug解决/代码讲解/毕业设计等 微信:study_51ctofx

这篇关于3.MyBatis源码解析-CRUD执行流程--阿呆中二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144876

相关文章

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my