jdbc增删改查_JDBC和MyBaits之争,Debug告诉你谁更胜一筹

目标:

从整体上了解MyBaits框架,并通过debug过程分析启动过程中涉及到的一些关键节点。

MyBaits 相比原生JDBC 有了哪些改进

通过这篇文章, 看看原始的JDBC访问数据库方式,和使用mybatis框架访问数据库方式的差异。我们会发现框架给人带来了很大的方便。主要是下面几点:

  • 连接获取和释放
  • SQL统一存取
  • 传入参数映射和动态SQL
  • 结果映射和结果缓存

MyBatis框架整体设计

6afc14109566ddf14fbd0e5cb8b57849.png

接口层

负责和应用层之间做交互,提供api接口给到用户调用,执行常见的增删改查,我们常见的mapper接口实际就是该层的。

数据处理层

通过传入参数,构建动态SQL语句;

SQL语句的执行以及封装查询结果集成List

框架支撑层

事务管理机制

连接池管理机制

缓存机制

SQL语句的配置方式

主要构件及其相互关系

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

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

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

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

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

TypeHandler:负责java数据类型和JDBC数据类型之间的映射和转换;

MappedStatement:MappedStatement维护了一条节点的封装;

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

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

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

c86f10c2a991d647db7201b51ad0092e.png
1c2d19f3ce735769b47975091373a756.png

MyBatis初始化机制

初始化入口

我们都知道使用mybatis的时候回有一个配置文件mybatis-config.xml ,mybait框架的初始化也是从这个配置文件开始的。

如果你是用的spring的话,在spring的配置文件中往往会有初始化sqlSessionFactory的过程。而在实例化sqlSessionFactory的过程中就会解析我们前面提到的配置文件(mybatis-config.xml),也是我们需要重点分析的部分。

8bd6137f208bcefcf247edf0a4c61653.png

核心配置文件的解析

主要是把配置文件里面的一个个节点分别解析到Configuration对象内保存。我们重点分析第10点,映射器的解析。

8d44f4c7776df2e3294c6c240285427e.png

映射器的解析

映射器就是我们应用内写的一个个mapper 以及他的xml文件。MyBaits 会通过XMLMapperBuilder对象来对这类xml文件解析。类似的如下图,包括三个builder对象,xmlconfigbuilder 是用于前面mybatis-config.xml 文件解析,用户定义的这类包含了sql的xml文件解析则是通XMLMapperBuilder实现,statementbuilder 的用法我们后文会提到。

fadfef2d35d41671316e8b1770c1de35.png

解析mapper文件和核心方法入口

78575a1adc165d04993e3f68aeabda0f.png
31ce05900a23580a2153295ad94d28cc.png

下面是具体到如何将一个xml中的 sql封装为一个MappedStatement 对象

b2bacd99c04c0fe79cb5481533633e50.png
cca39753f15f85778f6a87e1c458bb2e.png
590a4e73413f144d374d6b4bb0eb79b6.png

最后将mapperstatement对象存到configuration.addMappedStatement(statement); 统一管理。

我们来debug看下最终生成的mapperstatement都有些什么参数。

90d64b4aabfbe7b7cd215dced0d41010.png

下面再看看sqlSource对象。

5bfbe5c8f17867d1614c87bab89f2a21.png

最终所有的sql都会解析到Configuration对象里面

85268a3f2c1e93a44c163ad68ef1ad8c.png

是不是一目了然?如果有什么疑问,欢迎在评论区提出~

欢迎点赞、关注、转发,最近我在整理各大厂的Java技术分享资料,包含面经、项目框架拆解等,如有需要,私信我获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值