MyBatis是一个被广泛应用的持久化框架。一个简单的使用示例如下所示,先创建会话工厂,然后从会话工厂中打开会话,通过class类型和配置生成Mapper接口的代理实现,最后使用 Mapper进行持久化操作。
本文将从MyBatis中的SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession和Mapper几个方面入手简单分析MyBatis的实现原理。在后面的系列文章中会进一步具体分析核心类的细节实现。
SqlSessionFactoryBuilder使用Builder模式去生成SqlSessionFactory,因此只提供了多个build方法。这些方法可以接受XML配置文件的Reader或InputStream输入流,也可以传入 environment指定环境或传Properties作为属性。
在build方法的实现中,首先根据传入的输入流、environment和Properties构建XMLConfigBuilder对象,然后调用其parse()方法解析XML文件得到Configuration对象,最后创建 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是一个接口,默认实现是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通过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视频教程学习哦!
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54