大厂程序员,手写Mybatis

本文主要介绍了大厂程序员如何手写Mybatis的Executor执行器,目标是解耦DefaultSqlSession中的数据源调用、执行和结果封装。通过设计执行器接口、抽象基类和简单执行器实现,实现对SQL执行的解耦,提高代码的可扩展性和维护性。文章详细讲解了执行器的实现过程,并进行了单元测试,验证了解耦效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

为什么,要读框架源码?

因为手里的业务工程代码太拉胯了!通常作为业务研发,所开发出来的代码,大部分都是一连串的流程化处理,缺少功能逻辑的解耦,有着迭代频繁但可迭代性差的特点。所以这样的代码通常只能学习业务逻辑,却很难吸收到大型系统设计和功能逻辑实现的成功经验,往往都是失败的教训。

而所有系统的设计和实现,核心都在于如何解耦,如果解耦不清晰最后直接导致的就是再继续迭代功能时,会让整个系统的实现越来越臃肿,稳定性越来越差。而关于解耦的实践在各类框架的源码中都有非常不错的设计实现,所以阅读这部分源码,就是在吸收成功的经验。把解耦的思想逐步运用到实际的业务开发中,才会让我们写出更加优秀的代码结构。

二、目标

在上一章节我们实现了有/无连接池的数据源,可以在调用执行SQL的时候,通过我们实现池化技术完成数据库的操作。

那么关于池化数据源的调用、执行和结果封装,目前我们还都只是在 DefaultSqlSession 中进行发起 如图 7-1 所示。那么这样的把代码流程写死的方式肯定不合适于我们扩展使用,也不利于 SqlSession 中每一个新增定义的方法对池化数据源的调用。

  • 解耦 DefaultSqlSession#selectOne 方法中关于对数据源的调用、执行和结果封装,提供新的功能模块替代这部分硬编码的逻辑处理。
  • 只有提供了单独的执行方法入口,我们才能更好的扩展和应对这部分内容里的需求变化,包括了各类入参、结果封装、执行器类型、批处理等,来满足不同样式的用户需求,也就是配置到 Mapper.xml 中的具体信息。

三、设计

从我们对 ORM 框架渐进式的开发过程上,可以分出的执行动作包括,解析配置、代理对象、映射方法等,直至我们前面章节对数据源的包装和使用,只不过我们把数据源的操作硬捆绑到了 DefaultSqlSession 的执行方法上了。

那么现在为了解耦这块的处理,则需要单独提出一块执行器的服务功能,之后将执行器的功能随着 DefaultSqlSession 创建时传入执行器功能,之后具体的方法调用就可以调用执行器来处理了,从而解耦这部分功能模块。如图 7-2 所示。

SimpleExecutor
StatementHandler

四、实现

1. 工程结构

mybatis-step-06
└── src
    ├── main
    │   └── java
    │       └── cn.bugstack.mybatis
    │           ├── binding
    │           │   ├── MapperMethod.java
    │           │   ├── MapperProxy.java
    │           │   ├── MapperProxyFactory.java
    │           │   └── MapperRegistry.java
    │           ├── builder
    │           ├── datasource
    │           ├── executor
    │           │   ├── resultset
    │           │   │   ├── DefaultResultSetHandler.java
    │           │   │   └── ResultSetHandler.java
    │           │   ├── statement
    │           │   │   ├── BaseStatementHandler.java
    │           │   │   ├── PreparedStatementHandler.java
    │           │   │   ├── SimpleStatementHandler.java
    │           │   │   └── StatementHandler.java
    │           │   ├── BaseExecutor.java
    │           │   ├── Executor.java
    │           │   └── SimpleExecutor.java
    │           ├── io
    │           ├── mapping
    │           ├── session
    │           │   ├── defaults
    │           │   │   ├── DefaultSqlSession.java
    │           │   │   └── DefaultSqlSessionFactory.java
    │           │   ├── Configuration.java
    │           │   ├── ResultHandler.java
    │           │   ├── SqlSession.java
    │           │   ├── SqlSessionFactory.java
    │           │   ├── SqlSessionFactoryBuilder.java
    │           │   └── TransactionIsolationLevel.java
    │           ├── transaction
    │           └── type
    └── test
        ├── java
        │   └── cn.bugstack.mybatis.test.dao
        │       ├── dao
        │       │   └── IUserDao.java
        │       ├── po
        │       │   └── User.java
        │       └── ApiTest.java
        └── resources
            ├── mapper
            │   └──User_Mapper.xml
            └── mybatis-config-datasource.xml

工程源码: 公众号「bugstack虫洞栈」,回复:手写Mybatis,获取完整源码

SQL方法执行器核心类关系,如图 7-3 所示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值