自己手动仿写MyBatis框架完整版

 

一、MyBatis简介

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的Java对象)映射成数据库中的记录。

二、MyBatis特点

1、简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件和配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

2、灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。

3、解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

4、提供映射标签,支持对象与数据库的ORM字段关系映射

5、提供对象关系映射标签,支持对象关系组建维护

6、提供xml标签,支持编写动态sql。

三、源码目录结构

1、源码目录内容

1.1、日志

org.apache.ibatis.logging

org.apache.ibatis.logging.commons

org.apache.ibatis.logging.jdbc

org.apache.ibatis.logging.jdk14

org.apache.ibatis.logging.log4j

org.apache.ibatis.logging.log4j2

org.apache.ibatis.logging.nologging

org.apache.ibatis.logging.slf4j

org.apache.ibatis.logging.stdout

1.2、异常

org.apache.ibatis.exceptions

1.3、缓存

org.apache.ibatis.cache

org.apache.ibatis.cache.decorators

org.apache.ibatis.cache.impl

1.4、解析

org.apache.ibatis.parsing

xml解析,${} 格式的字符串解析

1.5、类型处理器

org.apache.ibatis.type

实现java和jdbc中的类型之间转换

1.6、IO

org.apache.ibatis.io

通过类加载器在jar包中寻找一个package下满足条件(比如某个接口的子类)的所有类

1.7、反射

org.apache.ibatis.reflection

org.apache.ibatis.reflection.factory

org.apache.ibatis.reflection.invoker

org.apache.ibatis.reflection.property

org.apache.ibatis.reflection.wrapper

可以参考MetaObjectTest来跟踪调试,基本上用到了reflection包下所有的类

1.8、数据源

org.apache.ibatis.datasource

org.apache.ibatis.datasource.jndi

org.apache.ibatis.datasource.pooled

org.apache.ibatis.datasource.unpooled

1.9、事务

org.apache.ibatis.transaction

org.apache.ibatis.transaction.jdbc

org.apache.ibatis.transaction.managed

1.10、会话

org.apache.ibatis.session

org.apache.ibatis.session.defaults

1.11、JDBC单元测试工具

org.apache.ibatis.jdbc

1.12、构建

org.apache.ibatis.builder

org.apache.ibatis.builder.annotation

org.apache.ibatis.builder.xml

1.13、映射

org.apache.ibatis.mapping

1.14、脚本

org.apache.ibatis.scripting

org.apache.ibatis.scripting.defaults

org.apache.ibatis.scripting.xmltags

1.15、注解

org.apache.ibatis.annotations

1.16、绑定

org.apache.ibatis.binding

1.17、执行器

org.apache.ibatis.executor

org.apache.ibatis.executor.keygen

org.apache.ibatis.executor.loader

org.apache.ibatis.executor.loader.cglib

org.apache.ibatis.executor.loader.javassist

org.apache.ibatis.executor.parameter

org.apache.ibatis.executor.result

org.apache.ibatis.executor.resultset

org.apache.ibatis.executor.statement

1.18、插件

org.apache.ibatis.plugin

2、源码包对应架构

四、MyBatis层次结构

五、自己的MyBatis设计思路阐述

在了解了MyBatis的设计原理及架构之后,我的简化版MyBatis初现端倪。总结之后如下图:

1、读取xml文件,建立连接

MyConfiguration负责与人交互。当读取xml文件后,会将属性和连接数据库的操作封装在MyConfiguration对象中供后面的组件调用。我打算将使用dom4j来读取xml文件,因为它具有性能优异和非常方便使用的特点。

2、创建SqlSession,搭建Configuration和Executor之间的桥梁

一个Session仅拥有一个对应的数据库连接。类似于一个前段请求Request,它可以直接调用execute来执行SQL语句。从流程图中可以看出,MySqlSession的成员变量中必须得有MyExecutor和MyConfiguration来集中做调配。MySqlSession中会有一个getMapper方法,使用动态代理生成对象后,就可以进行对数据库的操作。

3、创建Executor,封装JDBC操作数据库

Executor是一个执行器,负责SQL语句的生成和查询缓存的维护,也就是JDBC的代码将在这里构建。

4、创建MapperProxy,使用动态代理生成Mapper对象

要保证只对指定的接口生成一个对象,执行它的时候运行sql,而接口无法直接调用方法,所以这里使用动态代理生成对象,在执行时回到MySqlSession中调用对应的方法,最终由MyExecutor做JDBC对对应的方法调用执行。这样设计是为了单一职责,可扩展性更强。

六、基础环境

JDK 8 + MySQL 8。

这里有个坑,当时装数据库时直接官网下的最新版,在JDBC连接数据库时配置的参数需要修改,不然会报各种奇奇怪怪的错误,还是推荐大家使用MySQL 5版本。

七、代码编写

思路捋完了,该上代码了…我将按照我编写时的思路顺序一一阐述。由于我在项目里集成了日志,便于我们直观的查看各个类之间的调用顺序。

1、项目文件及目录结构

2、在创建的maven项目中的pom.xml文件中导入依赖

3、log4j的日志配置log4j.properties

4、创建连接数据库的参数配置文件config.xml

5、创建数据库test,创建t_user表

6、根据t_user创建实User实体类

7、创建UserMapper接口

8、对应的UserMapper.xml

9、基本配置到此结束,接下来实现MyConfiguration

10、使用面向对象的思想编写MapperBean包括接口名、接口下的方法

11、Function对象包括sql的类型、方法名、sql语句、返回类型和参数类型

12、接下来实现MySqlSession,成员变量里得有Excutor和MyConfiguration,代码的精髓就在getMapper(重要)的方法里

13、创建Executor接口解耦合

14、创建Executor实现类MyExecutor,在MyExecutor中封装了JDBC的操作

15、MyMapperProxy代理类完成读取的UserMapper.xml中方法与真实方法校验,并调用执行对应的方法

16、至此,自写的简版MyBatis框架已经完成,再写下测试代码RunOwnMybatis

17、这是执行结果

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值