mybatis的前身是iBatis,其源于“Internet”和“abatis”的组合,是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集,它可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJO映射成数据库中的记录。

mybatis的架构设计

Mybatis的功能架构分为三层:

  • 接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层接收到调用请求就会调用数据处理层来完成具体的数据处理。

  • 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

  • 框架支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

mybatis的运行流程

  1. 加载配置:配置来源于两个地方,配置文件和注解。将SQL的配置信息加载成为MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

  2. SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。

  3. SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。

  4. 结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。

手写mybatis的目录

来看下笔者的手写mybatis的文件目录。查看Bootstrap文件上说明,然后运行该文件,断点调试即可一步步了解mybatis框架的原理了。(很多地方都注解了,方便初学者更多了解框架细节)

代码地址请查看,https://github.com/y277an/java-you-need-know。再看看正版的代码结构吧。

考虑到transaction对理解框架原理产生干扰,所以代码全部删掉

mybatis目录结构及内容

以下目录对照的是mybatis-3.5.1的源码。

  • annotations。注解目录。包括所有的注解,如@SELECT,@UPDATE等。

  • binding。Mapper类的实例反射生成工具目录。

  • builder。主要是注解,mapper和SqlSource的构造器及转换器。

  • cache。Mybatis内部缓存接口。实现了一些特定的缓存策略,FifoCache、LruCache、BlockingCache、LoggingCache等。

  • dataSource。数据源工厂类及实现。实现类包括JndiDataSourceFactory、PooledDataSourceFactory和UnpooledDataSourceFactory。数据源实现类:UnpooledDataSource和PooledDataSource。

  • exceptions。Mybatis自定义的异常类,都继承自RuntimeException。

  • executor。执行器相关包。包括Key生成器、加载器(包括Cglib、Javassist的代理,结果加载器)、参数处理器接口、结果处理器、结果集(resultSet)处理器、Statement处理器(实现类:BaseStatementHandler、CallableStatementHandler、PreparedStatementHandler、RoutingStatementHandler、SimpleStatementHandler)、执行器(SimpleExecutor、ReuseExecutor、CachingExecutor、BatchExecutor、BaseExecutor)。

  • io。主要是定义的几个VFS(VFS、DefaultVFS、ClassLoaderWrapper)。

  • jdbc。与Sql相关的操作。如Sql运行器,脚本运行器和Sql封装类等。

  • logging。各个类型的日志适配器,都实现了Log接口。StdOutImpl、Slf4jImpl、NoLoggingImpl、Log4j2Impl、Log4jImpl、Jdk14LoggingImpl、BaseJdbcLogger和JakartaCommonsLoggingImpl。

  • mapping。主要是接口参数,sql和返回结果的映射类,主要类包括:MappedStatement、ParameterMap、ParameterMapping、ResultMap、ResultMapping、BoundSql和SqlSource等类。

  • parsing。变量解析,如解析${},#{}等。

  • plugin。主要包含插件的定义接口。如Interceptor、Plugin和InterceptorChain等。

  • reflection。主要是一些反射操作的工具方法和对象工厂类,以及一些常用的包装类,如BaseWrapper、BeanWrapper、CollectionWrapper、MapWrapper和ObjectWrapper。

  • scripting。执行驱动和动态Sql解析的处理器。

  • session。主要是SqlSession和SqlSessionFactory。

  • transaction。主要是mybatis简单封装的jdbc事务操作类。

  • type。各个类型数据的处理器。用于动态的设置参数和转换数据,如IntegerTypeHandler用来处理Integer类型的值的set和get操作。除了八大基本类型,还有常用的集合及Map类型,还增加了各种时间类型的处理器。

MyBatis的核心成员和职责

从MyBatis代码实现的角度来看,MyBatis的核心组件如下

  • SqlSession。作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能。

  • Executor。MyBatis执行器,是MyBatis调度的核心,负责SQL语句的生成和查询缓存的维护。

  • StatementHandler。封装了JDBC Statement操作,负责对JDBCstatement的操作,如设置参数、将Statement结果集转换成List集合。

  • ParameterHandler。负责对用户传递的参数转换成JDBC Statement 所需要的参数。

  • ResultSetHandler。负责将JDBC返回的ResultSet结果集对象转换成List类型的集合。

  • TypeHandler 负责java数据类型和jdbc数据类型之间的映射和转换。

  • MappedStatement。MappedStatement维护了一条<select|update|delete|insert>节点的封装。

  • SqlSource。负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回。

  • BoundSql。表示动态生成的SQL语句以及相应的参数信息。

  • Configuration。MyBatis所有的配置信息都维持在Configuration对象之中。

更多内容,欢迎关注微信公众号:全菜工程师小辉~


戳“阅读原文”一起来充电吧!

喜欢就点个“在看”呗^_^

手写mybatis彻底搞懂框架原理相关推荐

  1. mybatis 无法初始化类_从零开始手写 mybatis(一)MVP 版本

    什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyB ...

  2. druid连接池初始化慢_从零开始手写 mybatis (三)jdbc pool 从零实现数据库连接池

    前景回顾 第一节 从零开始手写 mybatis(一)MVP 版本 中我们实现了一个最基本的可以运行的 mybatis. 第二节 从零开始手写 mybatis(二)mybatis interceptor ...

  3. 了解mybatis源码手写mybatis

    一:mybatis概述 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  4. 手写MyBatis ORM框架

    手写MyBatis ORM框架 目标: 实现: 思路: 一.前期准备 1.加入依赖 2.自定义插入注解 3.自定义删除注解 4.自定义更新注解 5.自定义查询注解 6.自定义参数注解 7.定义和数据库 ...

  5. 从零搭建Spring Boot脚手架:手写Mybatis通用Mapper4

    1. 前言 继续搭建我们的kono Spring Boot脚手架,把国内最流行的ORM框架Mybatis也集成了进去.但是很多时候我们希望有一些开箱即用的通用Mapper来简化我们的开发.我自己尝试实 ...

  6. 手写Mybatis源码(原来真的很简单!!!)

    目录 一.JDBC操作数据库_问题分析 二.自定义持久层框架_思路分析 三.自定义框架_编码 1.加载配置文件 2.创建两个配置类对象 3.解析配置文件,填充配置类对象 4.创建SqlSessionF ...

  7. 手写MyBatis分页插件

    目录 前言 MyBatis插件 手写分页插件 总结 前言 在开发查询类的接口时,有一个让开发者比较头疼的问题:分页. 如果每次都要开发者自己去写limit,计算起始行和偏移量就太烦了,于是市面上诞生了 ...

  8. 从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper

    1. 前言 今天继续搭建我们的kono Spring Boot脚手架,上一文把国内最流行的ORM框架Mybatis也集成了进去.但是很多时候我们希望有一些开箱即用的通用Mapper来简化我们的开发.我 ...

  9. 手写mybatis完整sql插件

    问题产生 我们在使用mybatis的过程中,如果开启了mysql的日志功能的话,会在控制台打印一些sql的信息,但是日志中的sql语句,是没有拼接参数的,也就是说,是不可以直接放到数据库中执行的. s ...

最新文章

  1. MySql配置方法,批处理进行MySql配置
  2. 2021 几何图机器学习大盘点 | 几何深度学习先驱 Michael Bronstein长文解读
  3. Java之Object类与instanceof关键字
  4. python 中__name__ = '__main__' 的作用
  5. [导入]Dreamweaver插入Flash参数
  6. SAP Spartacus默认的baseSite是从源代码什么地方读取的
  7. Oracle_PL/SQL developer拷贝粘贴中文乱码问题
  8. c语言ffm是什么错误类型,FFM不能封装flv的问题和替代方案SFF
  9. 这个教人写出烂代码的项目在 GitHub 上火了...
  10. 日历小程序C语言,微信小程序实现日历功能
  11. Linux网络嗅探工具,微软“雪藏”的七个Windows 10强力工具
  12. IO编程——文件复制操作
  13. 如何用ps修改图片文字颜色
  14. Image Caption 常用评价指标
  15. 【2021年蓝桥杯Java-B组国赛题解】
  16. Java安装教程(windows)
  17. 产品开发中,TR是技术评审节点。
  18. 外链自动转内链html,typecho网站外链自动转换内链插件ShortLinks
  19. 1. Jewels and Stones (宝石与石头)
  20. Unity接入Google Play遇到Authentication canceled

热门文章

  1. PHP 对接阿里云短信服务完整流程
  2. 上海嘉定做网站,嘉定网站建设-品划网站怎么才能帮企赚钱?
  3. 酸了,大厂程序员凡尔赛的一天…
  4. 震撼来袭,阿里高工的源码解析笔记手抄本,看完去怼面试官
  5. 配置我的新服务器(用于联邦学习实验)
  6. [深度学习工具]·音频特征提取pyAudioAnalysis工具包
  7. Quant Macro:CTA与宏观经济指标的结合
  8. SQL注入攻击零距离
  9. 智能驾驶领域基础概念
  10. linux inittab内容,Linux inittab文件详解