动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

MyBatis的原理浅析

07-15 11:47 546浏览
举报 T字号
  • 大字
  • 中字
  • 小字

MyBatis是一个被广泛应用的持久化框架。一个简单的使用示例如下所示,先创建会话工厂,然后从会话工厂中打开会话,通过class类型和配置生成Mapper接口的代理实现,最后使用 Mapper进行持久化操作。

MyBatis的原理浅析

本文将从MyBatis中的SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession和Mapper几个方面入手简单分析MyBatis的实现原理。在后面的系列文章中会进一步具体分析核心类的细节实现。

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder使用Builder模式去生成SqlSessionFactory,因此只提供了多个build方法。这些方法可以接受XML配置文件的Reader或InputStream输入流,也可以传入 environment指定环境或传Properties作为属性。

在build方法的实现中,首先根据传入的输入流、environment和Properties构建XMLConfigBuilder对象,然后调用其parse()方法解析XML文件得到Configuration对象,最后创建 SqlSessionFactory对象并返回。

SqlSessionFactory

SqlSessionFactory是一个工厂接口,默认实现是DefaultSqlSessionFactory。SqlSessionFactory的作用是获取SqlSession,因此提供了多个openSession方法,支持从DataSource数据源和一个给定的连接Connection中创建SqlSession。

openSession方法的底层实现可以分为 5 步:

1.从Configuration对象中获取环境配置Environment;

2.根据环境配置得到事务工厂TransactionFactory;

3.从事务工厂得到事务Transaction,Transaction包装了数据库连接,处理数据库连接的创建、准备、提交、回滚和关闭;

4.创建执行器Executor;

5.创建SqlSession,返回DefaultSqlSession的实例。

创建SqlSession

SqlSession

SqlSession是一个接口,默认实现是DefaultSqlSession,提供了多种数据库操作方式,如 select、selectOne、selectList、insert、update、delete、commit、rollback 和 getMapper 等方法。getMapper方法用于获取Mapper接口的代理实现。在MyBatis中建议使用Mapper接口操作数据库。

数据库的增删改查和事务的提交回滚都是通过Executor执行的。Executor有3种类型SIMPLE、REUSE、BATCH,默认使用简易执行器SIMPLE,REUSE类型执行器重用预处理语句,BATCH类型执行器重用预处理语句和批量更新。Executor对象的创建在Configuration类型的newExecutor方法中进行。

Executor在执行过程中,会用到StatementHandler、ParameterHandler和ResultHandler,其中StatementHandler封装了java.sql.Statement的相关操作,ParameterHandler封装了SQL 对参数的处理,ResultHandler封装了对返回数据集的处理。Executor的执行过程,就是对这 3 个对象的调度过程。更多分析在后续文章中进行。

Mapper

Mapper通过JDK动态代理实现的,在MapperProxyFactory中创建MapperProxy并进行接口代理封装。对Mapper接口的调用实际上是由MapperProxy实现的。

JDK动态代理

在MapperProxy中,实现了InvocationHandler的invoke方法。methodCache是一个ConcurrentHashMap,其中存储了方法与MapperMethod的对应关系。从methodCache缓存中获取或创建MapperMethod对象,然后调用MapperMethod对象的execute方法执行数据库操作。

MapperProxy

创建MapperMethod对象时,会在构造函数中初始化SqlCommand 和MethodSignature。SqlCommand包含了数据库操作的名称,格式为 “接口名.操作名称”,以及XML中配置的操作类型,如select、update等,把一个Mapper接口与XML中的一个配置结合起来。MethodSignature是方法的签名,标记了方法的返回值类型,对于使用RowBounds(offset 和 limit 配置)、ResultHandler(结果处理回调)作为参数的方法记录参数位置并初始化参数处理器。

在MapperMethod的execute方法中,根据SqlCommand中的配置选择SqlSession的方法,根据MethodSignature的配置处理传入的参数,调用SqlSession的方法进行数据库操作,最后根据 MethodSignature的返回值类型返回操作结果。

动力节点在线课程涵盖零基础入门,高级进阶,在职提升三大主力内容,覆盖Java从入门到就业提升的全体系学习内容。全部Java视频教程免费观看,相关学习资料免费下载!对于火爆技术,每周一定时更新!如果想了解更多相关技术,可以到动力节点在线免费观看MyBatis视频教程学习哦!

0人推荐
共同学习,写下你的评论
0条评论
代码小兵988
程序员代码小兵988

67篇文章贡献228982字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java面试题及答案整理

提枪策马乘胜追击04-21 20:01

Spring常见面试题

代码小兵92504-17 16:07

Java零基础实战项目——五子棋

代码小兵98804-25 13:57

Java string类详解

杨晶珍05-11 14:54

6道经典算法面试题

杨晶珍05-12 16:39

发评论

举报

0/150

取消