最全的mybatis源码解析

最全的mybatis源码解析
在进行解析之前我们将mybatis进行零件话的拆分,简单的描述每一个mybaitis零件(类)是如何进行工作的,然后mybatis如何将这些零件进行组装形成一个完整的框架进行对外的服务。
mybatis核心组件介绍

SqlSessionFactoryBuilder
用于创建sqlSessionFactory,他通过使用java自带的xpath读取配置文件创建sqlSessionFactory对象,并且将配置文件里的东西存入configuration对象,

Configuration:
用于描述MyBatis的主配置信息,其他组件需要获取配置信息时,直接通过Configuration对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler等注册到Configuration组件中,其他组件需要这些信息时,也可以从Configuration对象中获取,此对象在mybatis解析配置文件的时候生成,他采用中介者模式,将大量mybatis的属性和对象封装在里面,其他对象需要的时候可以直接从这个对象里面取出使用,类似于spring 的容器,避免对象之间复杂的耦合关系,可以理解为mybatis的简易Ioc
MapperRegistry
mapper文件解析之后的容器,里面有个属性:
Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap<>();
也就是说每一个mapper文件解析之后的方法接口都放在了这里,一个MapperProxyFactory对应一个mapper.xml。
mapperProxyFactory
mapperProxyFactory,在读取配置文件的时候在读取每一个mapper的时候会创建对应的mapperProxy,如上面所说,mapperProxyFactory放的是mapper里面的每一个方法,属性,采用懒加载的模式,以后需要用到这个mapper的时候,通过反射代理创建一个mapperProxy,创建了之后有spring就放入容器里面。

sqlSessionFactory
用于创建sqlSession的工厂,通过当前的环境变量,和事务属性,为每一个执行查询的线程创建一盒sqLSession

• SqlSession:
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
}
SqlSession是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。SqlSession是Executor组件的外观,目的是对外提供易于理解和使用的数据库操作接口,sqlsession就是用户直接使用mybatis的顶级接口,同时也是线程私有的对象,不安全不能共享,以及缓存就是sqlSession级别,通过传入对应的mapper类型,创建对应的mapper,怎么创建呢,其实就是都configuration的mapperRegister 通过类型获取对应的mapperProxyFactory,然后就反射就可以了

• Executor:
Executor是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。

• MappedStatement:
MappedStatement用于描述Mapper中的SQL配置信息,是对Mapper XML配置文件中<select|update|delete|insert>等标签或者@Select/@Update等注解配置信息的封装,一个MappedStatement对象对应Mapper配置文件中的一个select/update/insert/delete节点,主要描述的是一条SQL语句,也就是说一个mapper.xml文件解析之后可以产生多个MapperStatement,解析完了之后存储在configuration对象里面存储方式如下

Map<String, MappedStatement> mappedStatements;

key就是:mapper的nameSpace+方法名
value: mappedStatements

• StatementHandler:
StatementHandler封装了对JDBC Statement对象的操作,比如为Statement对象设置参数,调用Statement接口提供的方法与数据库交互,等等。

• ParameterHandler:
当MyBatis框架使用的Statement类型为CallableStatement和PreparedStatement时,ParameterHandler用于为Statement对象参数占位符设置值。

• ResultSetHandler:
ResultSetHandler封装了对JDBC中的ResultSet对象操作,当执行SQL类型为SELECT语句时,ResultSetHandler用于将查询结果转换成Java对象。

• TypeHandler:
TypeHandler是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatement或CallableStatement对象对应的setXXX()方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()获取SQL执行结果。
了解了MyBatis的核心组件后,我们再来了解一下使用MyBatis操作数据库的过程

总结一下
1、读mybatis-configuration.xml,创建sqlsessionBuilderFactory,同时将读取到的内容
a 数据源,事务管理器 -----》放到 environment 对象
b 全部mapper.xml -------> mapperRegister 对象
c 每一个 mapper.xml ----- > mapperProxyFactory
d mapper 里面的每一个方法 —》mapperStatement
e 拦截器也存起来
f 上面的全部存入到configuration对象里面,所以configuration就像是一个容器,然后,b持有c,c持 有d
g其他对象则是用来执行或者反射创建对象或者串联整个链条

mybatis核心工作流程图
上面介绍了mybatis的核心组件及其作用,其实不论什么项目,不论什么框架,设计者都会像进行模块的划分,总体的设计,然后分组开发,所以不论是项目还是框架,都可以看作是一个一个的零件的组合,每一个零件就是一个模块,就像变形金刚似的,当然当某一个零件(模块)有问题或者不符合你的要求的时候,我们也可以将这个模块拿出来,运用重写,继承,重载等java 的特新对项目里的一个小零件(模块)进行改造,从而打造符合你们自己的框架,这也就是二次开发。下面我画了一个流程图去描述mybatis是如何进行工作的(图片太长,我就简单分成三张,从上往下看即可)
在这里插入图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/20210109181741113.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTYzODAzMQ==,size_16,color_FFFFFF,t_70

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值