分析mybatis框架原理以及手写mybatis框架(原理篇)

作为一个Java程序猿,平时工作中一般都会使用到mybatis的框架,闲来就将这个框架做一个巩固和加深认识,文章打算分为原理篇、手写代码篇、分析源码篇,三个篇章,此为原理篇,里面的内容只是作为回顾和总结,不能保证其完全的准确性,只当做是交流学习,有错误的地方还望各位大佬指正。

架构图:

接口层

接口层是mybatis提供开发人员的一套API,主要通过Session和Mapper接口通知mybatis框架调用哪一条SQL命令以及SQL命令关联的参数;

数据处理层

数据处理层是mybatis框架内部的核心实现,用来完成对映射文件的解析以及数据处理,主要功能如下:

  1. 参数解析与参数绑定;
  2. SQL解析;
  3. 结果集映射解析与结果集映射处理。

基础支撑层

基础支撑层用来完成mybatis与数据库基本连接方式以及SQL命令与配置文件对应,主要功能如下:

  1. mybatis与数据库连接方式管理;
  2. mybatis对事务管理的方式;
  3. 配置文件的加载;
  4. mybatis查询缓存的管理。

架构流程图

mybatis配置文件

  • mybatis-config.xml此文件作为mybatis的全局配置文件,配置了mybatis的运行环境。
  • Mapper.xml此文件作为mybatis的SQL映射文件,文件中配置了操作数据库的sql语句。此文件需要在mybatis-confi.xml中加载。

SqlSessionFactory

  • 通过mybatis环境等配置信息构造SqlSessionFactory,即会话工厂。

SqlSession

  • 通过会话工厂创建SQLSession,通过SQLSession会话接口对数据库进行CRUD操作

Executor执行器

  • mybatis底层定义了Executor执行器接口来具体操作数据库,Executor接口有两个实现,一个是基本执行器(默认),一个是缓存执行器,SQLSession底层是通过Executor接口操作数据库的。

MappedStatement

  • 为mybatis底层的一个封装对象,它包装了mybatis配置信息以及SQL映射信息等。mapper.xml文件中一个select\insert\update\delete标签对应一个Mapped Statement对象,select\insert\update\delete标签的id,就是mappedStatement的id。
  • 它对SQL执行输入参数进行定义,包括hashmap、基本数据类型、pojo。Executor通过MappedStatement在执行sql前将输入的Java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
  • 它对SQL执行输出的结果进行定义,包括hashmap、基本数据类型、pojo。Executor通过MappedStatement在执行sql后将输出结果映射至Java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

调用流程图

SQLSession

接收开发人员提供的statementId和参数,并返回操作结果。

Executor

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

StatementHandler

封装了jdbc statement操作,负责对jdbc statement操作,包括对statement设置参数,以及将返回的结果集转换成list。

ParameterHandler

负责对用户传递的参数转换成jdbcstatement所需要的参数。

ResultsetHandler

负责将jdbc返回的resultset结果集对象转换成list。

TypeHandler

负责jdbcType和JavaType之间的数据类型转换

MappedStatement

维护了一条select、insert、update、delete节点的封装

SQLsource

根据用户传入的parameterObject,动态的生成SQL语句,将信息封装到BoundSql对象中,并且返回BoundSql表示动态生成的SQL语句以及相应的参数信息。

Configuration

mybatis的所有配置信息都维持在configuration对象中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
手写MyBatis框架可以遵循以下步骤: 1. 创建一个配置类,用于加载数据库配置信息和Mapper接口配置信息。 2. 创建一个SqlSession类,用于管理数据库连接、执行SQL语句和返回结果。 3. 创建一个Mapper接口,定义数据库操作方法。 4. 创建一个MapperProxy类,实现动态代理,将Mapper接口的方法调用转发给SqlSession执行对应的SQL语句。 5. 创建一个MapperRegistry类,用于管理Mapper接口和对应的MapperProxy对象。 6. 创建一个DefaultSqlSessionFactory类,用于创建SqlSession对象。 7. 创建一个SqlSessionFactoryBuilder类,用于读取配置信息并创建DefaultSqlSessionFactory对象。 8. 创建一个Configuration类,用于保存MyBatis的全局配置信息。 9. 创建一个Executor类,用于执行SQL语句。 10. 创建一个StatementHandler类,用于封装和执行JDBC操作。 11. 创建一个ResultSetHandler类,用于处理查询结果集。 12. 创建一个TypeHandler类,用于处理Java类型和数据库类型之间的转换。 13. 创建一个XMLMapperBuilder类,用于解析Mapper配置文件,并将解析结果注册到Configuration中。 14. 创建一个XMLConfigBuilder类,用于解析MyBatis配置文件,并将解析结果保存到Configuration中。 15. 在主程序中,使用SqlSessionFactoryBuilder读取配置信息创建SqlSessionFactory,并通过SqlSessionFactory创建SqlSession对象,最后使用SqlSession获取Mapper接口的代理对象,从而实现对数据库的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值