【Mybatis】我抄袭了Mybatis,手写一套MyMybatis框架:初窥mybatis源码

2024-01-18 11:36

本文主要是介绍【Mybatis】我抄袭了Mybatis,手写一套MyMybatis框架:初窥mybatis源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在历经之前几章课程的深入学习之后,我想我们已经初步掌握了如何运用jdbc连接数据库的技术;同时,我们也实现了利用mybatis框架的能力,甚至尝试着手编写、实现了ORM的框架。我坚信大家对MyBatis的理解和应用已经达到了一定程度。然而,你们是否有思考过为何MyBatis能够具备如此强大的效能呢?因此,在本次课程中,我们将全面剖析MyBatis的源代码,以此揭示其背后隐藏着的卓越功能的实现原理。为了方便我们的Debug实验,我们仍然会参考并使用在上一章节课程所提到的Mybatis-Demo模块进行操作。

文章目录

    • 第一行(获取xml配置文件)
    • 第二行(解析xml文件内容)
    • 第三行(构建DefaultSqlSession对象)
    • 第四行(开始执行查询方法)

在接下来的探究过程中,我们首要需要的就是MyBatis的源代码。建议各位同学可以登录mybatis官方网站获取并下载该源代码(地址为:https://github.com/mybatis/mybatis-3)。

在这里插入图片描述

我们首先可以看到我们的启动类是这样的

package com.masiyi;import com.masiyi.dao.UserDao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;/*** @Author masiyi* @Date ${DATE}* @PackageName:com.masiyi* @ClassName: ${NAME}* @Description: TODO* @Version 1.0*/
public class Main {public static void main(String[] args) throws IOException {InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);try (SqlSession session = sqlSessionFactory.openSession()) {UserDao mapper = session.getMapper(UserDao.class);mapper.findById(1).forEach(System.out::println);System.out.println("----------------------------");mapper.findAll().forEach(System.out::println);}}
}

第一行(获取xml配置文件)

就和上一篇文章一样。第一行的意思就是引入我们的mybatis的配置文件。这个配置文件要在我们的resource资源目录下面。我们现在去看这个resource类做了哪些动作?

在这里插入图片描述

经过这个方法之后,我们可以看到他需要调类加载器的getResourceAsStream这个方法。

在这里插入图片描述

最终把我们的传进来这个字符串给转化为url。

在这里插入图片描述

实际上他根据我们的类加载器找到了这个配置文件在我们本机环境下的绝对路径。这样他就能根据绝对路径转化为一个输入流。方便我们后续的读配置文件的要求。

在这里插入图片描述

运行完第一行之后,我们的目的就完成了,他最终给我们的是一个输入流。

在这里插入图片描述

第二行(解析xml文件内容)

第二行我们可以看到它其实进入了一个build的重载方法。第二个参数和第三个参数全都是null,他也就是说只传入了我们第一行代码,给过我们的输入流。通过我们的输入流,他给我们建造了一个XMLConfigBuilder对象。这个对象的目的就是用来解析我们的xml的配置文件。就有点类似于我们mymybatis里面的ConfigParse文件。

在这里插入图片描述

因为我们有了这个对象,所以我们可以直接去调用里面的pass方法去解析。所以说这个pass里面的方法基本上囊括了我们xml文件中所有配置的标签。都在这里进行一个解析。

在这里插入图片描述

我们进入到这个方法里面,就可以看到很多熟悉的标签。而xml文件里面能配置的标签基本上都在这里。

在这里插入图片描述

我们再来看一下我们的配置文件长什么样子?

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://masiyi.obmtj0gc1rgs0ho0-mi.oceanbase.aliyuncs.com:3306/test_ob"/><property name="username" value="rootmsy"/><property name="password" value="Msy18719255298"/></dataSource></environment></environments><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>

所以说,我们直接看environments 这个标签里面他就是我们要解析的,其他都是我们没有写,所以他直接就return直接跳过了。

在这里插入图片描述

我们在这个方法里面看到了。他读取到了xml文件里面数据库相关的信息。他都把它存在这里。之后把configuration的Environment这个属性给他set值。

在这里插入图片描述

之后在mapperElement方法里面也解析了我们插面文件里面的mapper节点里面的信息。

在这里插入图片描述

这些操作解析完了之后,我们返回了一个DefaultSqlSessionFactory这个实体类,并且把我们刚刚构建了configuration这个类给赋值进去。所以说这个第二行它的目的就是解析我们的xml文件。并把里面所有的信息都解析出来配置给configuration这个类。

在这里插入图片描述

第三行(构建DefaultSqlSession对象)

在这里插入图片描述

最后进入到了这个openSessionFromDataSource方法,这个方法我里面我们可以看到他通过配置对象进行了很多相关的操作,比如说我们创建一个事物,我们构建事物的对象。如果说熟悉我们自己写框架,我们可以看到它也是New了一个执行器出来。最后他把这些串联出来的对象全部封装成一个DefaultSqlSession对象给返回出去。

在这里插入图片描述

第四行(开始执行查询方法)

熟悉我们自定义框架的同学,看到这一步就知道了。他通过 session.getMapper创建出来的对象其实是一个代理对象。他真正执行的方法都是被我们的mybatis全部给代理了。

我们进入findById这个方法里面可以看到它其实走的我是我们invoke方法。

在这里插入图片描述

到了这一步,可谓我们终于见到了my buddies的庐山真面目,她执行了invoke方法,里面会最终进入到这个方法,这个方法的作用其实就是解析我们的增删改查。例如我们的xml文件里面写的是select方法,它就会走到对应的枚举类里面去。

在这里插入图片描述

相信看到这里的同学已经特别特别特别熟悉了。根据传进来的statement我们可以找到。Configuration里面mappedStatements。对应的MappedStatement

在这里插入图片描述

到了这里。学习了我们jdbc连接MySQL的课程时候就非常的熟悉了。看到这些变量和类,这些不就是我们前面第一节课学到的类吗?

在这里插入图片描述

最终还是通过execute方法,也就是jdbc里面的方法。执行了SQL。最终获得了结果。

在这里插入图片描述

最后根据SQL查询到的结果封装成我们的resultType属性里面对应的类

在这里插入图片描述

至此,我们的课程就学完了。我们已经知道了mybatis的最基本的操作大家感兴趣的可以去我的代码仓库里面去查看详细的代码
https://gitee.com/WangFuGui-Ma/my-mybatis。

哦,对了。感谢博学谷的子慕老师提供的mybatis源码(带注释的内容)。

在这里插入图片描述

另外如果对Elastic Search感兴趣的话,推荐一下我的专栏,这篇专栏介绍了Elasticsearch的Restful API的入门指南。学习如何使用API进行索引、搜索和分析,包括创建索引、定义映射、添加文档、执行查询等。通过实例和代码片段,快速上手Elasticsearch的Restful API,构建强大的搜索功能。感谢大家支持:

Elastic Search的RestFul API入门

在这里插入图片描述

这篇关于【Mybatis】我抄袭了Mybatis,手写一套MyMybatis框架:初窥mybatis源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

Spring+MyBatis+jeasyui 功能树列表

java代码@EnablePaging@RequestMapping(value = "/queryFunctionList.html")@ResponseBodypublic Map<String, Object> queryFunctionList() {String parentId = "";List<FunctionDisplay> tables = query(parent