前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyBatis 原理浅析——基本原理

MyBatis 原理浅析——基本原理

作者头像
Java编程指南
发布2019-08-02 15:35:10
4210
发布2019-08-02 15:35:10
举报
文章被收录于专栏:Java编程指南Java编程指南

转载自:https://www.jianshu.com/p/4ea0404c1327

前言

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

本文将从 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 步:

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

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

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

④创建执行器 Executor;

⑤创建 SqlSession,返回 DefaultSqlSession 的实例。

其中从 DataSource 数据源创建 SqlSession 的过程如下所示:

创建 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 的返回值类型返回操作结果。

每周 3 篇学习笔记或技术总结,面向有一定基础的 Java 程序员,内容涉及 Java 进阶、虚拟机、MySQL、NoSQL、分布式计算、开源框架等多个领域。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java编程指南 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SqlSessionFactoryBuilder
  • SqlSessionFactory
  • SqlSession
  • Mapper
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档