资讯专栏INFORMATION COLUMN

教你手写Mybatis框架

antyiwei / 2822人阅读

摘要:前言嗨,小伙伴们,这篇博文将带大家手写,让大家对的核心原理以及工作流程有更加深刻的理解。模块顾名思义,就是框架配置类,用于解析配置文件加载相关环境。配置模块这里的对框架的配置使用了简单的,主要原因还是简单易懂然后节省时间。

前言

(。・∀・)ノ゙嗨,小伙伴们,这篇博文将带大家手写mybatis,让大家对mybaits的核心原理以及工作流程有更加深刻的理解。在上篇Spring-Mybatis运行机制概括以及上上篇MyBatis原理概括发布后,由于本人事情较多导致这篇博文却迟迟没出来,这里需要跟大家深感抱歉。但是,这篇如果你看了,我想你应该会觉得这一切都是值得的,因为以后在面试过程中或者在同事面前就可以好好装装啦,哈哈。
嗯哼,废话不多说,咱们直接进入主题。

成果

这里先给大家看看如果你们看了这篇博文之后,能达到什么样的成果。

public class Entry {
    public static void main(String[] args) {
        MtConfiguration configuration = new MtConfiguration("mybatis-config.properties");
        MtSqlSessionFactoryBuilder sqlSessionFactoryBuilder = new MtSqlSessionFactoryBuilder(configuration);
        MtSqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build();
        MtSqlSession sqlSession = sqlSessionFactory.openSession();
        PersonDao personDao = sqlSession.getMapper(PersonDao.class);
        Person person = personDao.queryPersonById(1l);
        System.out.println(person);
    }
}

了解Mybatis使用的同学们,能看出这跟你们常用的Mybatis有什么区别吗?区别还是有的,只是很像有木有。
然后再让大家看看这个仿真版的Mybatis框架由哪些部分组成,下面是框架的代码目录。

从上面的图中可以看到涵盖了executor、plugin、typehandler等基础组件。然后再看下是如何使用的。

有没有发现使用过程中跟原生Mybatis使用方式基本一致。最后就是大家应该比较关心的部分了,那就是源代码能提供吗???答案是肯定!
handwritten_mybatis_framework 希望喜欢的小伙伴能star哦。

解析
有些小伙伴可能会有疑问,怎么才能写出这样的框架呢?这个怎么回答呢,其实写出来只需要你对Mybatis的工作原理有大致的了解,知道那些模块是做什么的又是怎么实现的,然后画个流程图,然后定义需要哪些类和接口去实现,最后只需要将这些定义好的类和接口填空就可以了。
那么现在我们来看看这个仿真Mybatis是怎么工作的,当然需要申明的是这个框架仅仅只是作为了解Mybatis运行原理的一个代码练习,有些地方的代码可能只是为了演示这样的效果,并不一定完全跟原生一样。比如Mybatis需要解析XML,而这里我们投了个懒,直接上properties。这样我们就可以重点关注Myabtis的业务流程啦。

接下来对框架的每个部分进行一个简单的说明,具体还请小伙伴去看代码好好了解然后有什么问题直接在评论区或者私信我就可以了,我保证看到就回复,哈哈。

1.configuration模块

顾名思义,就是框架配置类,用于解析配置文件加载相关环境。这里代码里对配置文件的初始化主要有以下这么一个流程。

    public MtConfiguration(String configLocation){
        this.configLocation = configLocation;
        init();
    }

    private void init(){
        try {
            //记载配置文件,这里使用properties代替xml解析
            loadConfigProperties();
            //初始化数据源信息
            initDataSource();
            //解析并加载mapper文件
            loadMapperRegistory();
            //解析加载plugin
            initPluginChain();
            //解析加载typeHandler
            initTypeHandler();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }

可以看到实例类的时候调用init方法进行初始化,分别加载配置信息、初始化数据源信息、解析并加载mapper文件、解析加载plugin、解析加载typeHandler这几个步骤。具体如何进行小伙伴们可以看下代码实现,代码写得简单,相信你们一看就懂。

2.session模块

这个模块用于用户与框架交互的入口。包括常用的sqlSession、sqlSessionFactory以及sqlSessionFactoryBuilder。这几个类完全是仿照Mybatis的,只是类实现会相对简单很多。至于每个类用来干嘛,这个我在之前的文章中有讲述,这里就不多做赘述啦,只是简单引导讲解框架信息。

3.Mapper映射模块

这个模块主要用来注册我们的mapper映射文件的。

这里需要说明下MapperData这个类,这个类主要记录sql语句和sql语句返回类型信息的。然后MapperRegistory用来保存方法与MapperData的映射关系,这样我们执行某个方法是就能找到对应的Sql语句和对应的返回类型了。这个过程可以结合Mybatis解析mapper.xml的过程去理解。

public class MapperData {
    private String sql;
    private Class type;

    public MapperData(String sql, Class type) {
        this.sql = sql;
        this.type = type;
    }

    public String getSql() {
        return sql;
    }

    public void setSql(String sql) {
        this.sql = sql;
    }

    public Class getType() {
        return type;
    }

    public void setType(Class type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "MapperData{" +
                "sql="" + sql + """ +
                ", resultType=" + type +
                "}";
    }
}
4.Executor执行模块

这个模块主要用于执行SQL语句并且结合各种handler处理,然后这里只是写了一简单的执行器类。

5.handler模块

这里模仿Mybatis执行SQL时的过程,stamentHandler用于处理语句集、parameterHandler用于处理参数、resultHandler用于处理结果映射。

6.plugin模块

这里模仿Myabtis插件的工作原理实现的,也就是说这里和原生Mybatis的plugin基本一样,不过这里我又偷了个懒,目前只能实现对executor的拦截。哈哈,别怪我。

7.typeHandler模块

这里模仿Mybatis类型处理的机制,用于javaType到jdbcType的映射处理以及jdbcType到javaType的映射处理,当然这只是演示这样的一种效果,具体实现其实没有像Mybatis那样复杂。你们看代码应该也能看出来。

8.配置模块

这里的对框架的配置使用了简单的properties,主要原因还是简单易懂然后节省时间。

使用

本地使用的话其实就跟项目入口文件那样,拉下代码,修改数据源信息,导入数据库,pom依赖下载然后运行就跟远程Mybatis那样使用就可以了,最后剩下的你们就可以自由发挥修改代码,相信你们能做得更好。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71269.html

相关文章

  • 开源框架解析,手写MyBatis细节思路

    摘要:基本纲要组成动态配置配置核心源码分析源码解析源码解析源码解析源码解析手写框架是什么本质是一种半自动的框架,前身是其源于和的组合,除了和映射关系之外,还需要编写语句映射三要素映射规则快速入门加入的依赖添加的配置文件场景介绍编写实体类接口以及文 showImg(https://segmentfault.com/img/bVblrnC); Mybatis基本纲要 Mybatis组成 · 动态...

    paulli3 评论0 收藏0
  • 解密Mybatis,手写Mybatis框架(一)

    摘要:核心流程三大阶段缕清思路也就是核心流程之后,我们就开始写代码了,详见下节 Mybatis快速入门 步骤: 1.加入mybatis的依赖 2.添加Mybatis的配置文件 3.场景介绍 4.编写实体类丶mapper接口及mapper.xml文件 5.编写测试代码 demo: public class TUser { private Integer id; priva...

    SunZhaopeng 评论0 收藏0
  • 从手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis的文章加入

    摘要:看我这边文章的人,请先去,完全学习完了,理解了,再过来我这边看看吧,反正我是刚从转来的小白,有可以改良的请告诉我哈首先是它最后没有做层开始先把先回顾一下它最后做到包下的先这是他写的第一个方法,我把它稍微改成自己熟悉的写法,效果都是一样的然 看我这边文章的人,请先去http://blog.csdn.net/qq598535...,完全学习完了,理解了,再过来我这边看看吧,反正我是刚从ph...

    Berwin 评论0 收藏0
  • 解密Mybatis,手写Mybatis框架(二)

    摘要:三大巨头结果集再通过反射机制映射到对象上面,便做好了数据的映射关于映射具体内容可查阅资料及源码到这我们已经完成了一个简易的框架了通过手写一个简单的框架,我们就可以看得懂源码了,学习框架设计的思路并且增强我们的内功 简化版Mybatis实现思路 1.创建SqlSessionFactory实例. 2.实例化过程中,加载配置文件创建configuration对象. 3.通过factory创...

    chuyao 评论0 收藏0
  • 后端API从入门到放弃指北

    摘要:菜鸟教程框架中文手册入门目标使用搭建通过对数据增删查改没了纯粹占行用的拜 后端API入门学习指北 了解一下一下概念. RESTful API标准] 所有的API都遵循[RESTful API标准]. 建议大家都简单了解一下HTTP协议和RESTful API相关资料. 阮一峰:理解RESTful架构 阮一峰:RESTful API 设计指南 RESTful API指南 依赖注入 D...

    Jeffrrey 评论0 收藏0

发表评论

0条评论

antyiwei

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<