MyBatis架构分析
我们都知道Mybatis
是一个非常小巧灵活的ORM框架,深受国内广大开发者的喜爱,我们知道它的出现某种程度是为了消除所有的JDBC代码和参数的手工设置以及结果集的封装问题;基于这个一点,我们就可以知道MyBatis
实际上就是对JDBC的封装,所以这节我们就来看下MyBatis
是怎样对JDBC封装的,从而可以借鉴学习其他优秀框架在解决问题之初从架构设计层面的思考,然后通过执行流程分析,进一步深刻理解Mybatis
的工作原理。
首先我们先来了解下MyBatis
的架构设计
MyBatis
总共把功能架构分成了四部分:
接口层
提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理, Mybatis
提供了两种方式
- 下面的这些方法就是在
SqlSession
接口中提供的接口方法
<T> T selectOne(String statement,Object parameter);
<E>List<E> selectList(String statement,Object parameter);
int insert(String statement,Object parameter);
int update(String statement,Object parameter);
int delete(String statement,Object parameter);
- Mapper代理的方式
Mapper 代理的方式实际上就是通过创建接口(UserMapper 接口)的代理对象调用接口中的方法,最终执行方法调用是 Executor 对象,底层其实还是调用的传统的 API 方法。
数据处理层
数据处理层这部分主要就 JDBC 的核心内容了,包括参数映射、类型转换、SQL 解析、 SQL 执行以及结果的封装,这部分内容就可以理解成 JDBC 的核心内容,这里有几个重要类
- ParameterHandler∶ SQL的参数处理
- ResultSetHandler∶ 结果集处理
- StatementHandler:封装了JDBC Statement操作,设置参数,转换结果集
- Executor∶ MyBatis 的执行器,用于执行增删改查操作
SQL解析
MyBatis支持两种 SQL
解析的方式,一种 xml、一种是注解;两种方式对于一些基础的 CRUD 区别不大,使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句, Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。因此,如果你需要做一些很复杂的操作,最好用 XML来映射语句
框架支撑层
这部分主要是框架抽取出来的通用组件包括数据源管理、事务管理、配置加载和缓存处理;为上层的数据处理层提供最基础的支撑
- 数据源管理
数据源的管理对于持久层的框架来说,可谓是非常的重要,稍有不慎就会浪费大量系统资源,MyBatis 也对此做了很好的支持, MyBatis 有三种内建的数据源类型 UNPOOLED、 POOLED 、 JNDI- UNPOOLED-这个数据源的实现会每次请求时打开和关闭连接
- POOLED-这种数据源的实现利用"池"的概念,将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间
- JNDI-这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI上下文的数据源引用。这种已经不用了
通常情况下,我们是会使用 POOLED 的,他可以帮我们节省很多宝贵的系统资源
- 事务管理(transactionManager)
在 MyBatis 中有两种类型的事务管理器(JDBC
/MANAGED
)它通过一个顶层的Transaction
接口以及其不同实现JdbcTransaction
和ManagedTransaction
来实现对事务的管理∶- JDBC-这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域,对应的实现类
JdbcTransaction
- MANAGED-这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文),对应的实现类
ManagedTransaction
- JDBC-这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域,对应的实现类
对事务的管理,在和 Spring
整合之后,通常会用 Spring
的事务管理器
- 缓存处理
缓存对于持久层框架来说还是非常重要的,一定程度上可以减少和数据库的交互, MyBatis 的提供了两种缓存机制,一级缓存和二级缓存- 一级缓存∶ 是 SqlSession 级别的缓存,也就是会话级别的,如果两个相同的查询,第二次的查询会直接先从缓存中去拿,一级缓存也是默认开启的,这部分我们在源码分析的内容里会详细分析
- 二级缓存:是 Mapper 级别的缓存,也就是一个 xxx.xml 内的查询是可以共用的,需要手动开启
引导层
这部分是 MyBatis
启动时核心配置文件的方式,严格来说也可以不算在架构层面,不过MyBatis
也是提供了两种方式,一个是xml的方式,也是用的比较多的,一种是使用 Java API的方式比如在配置环境的时候
- xml的方式
<?xmL version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration
PUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<!--省略-->
</environment>
</environments>
</configuration>
- Java API的方式
Environment environment = new Environment("development",transactionFactory,dataSource);
Configuration configuration = new Configuration(environment)) ;
虽然 MyBatis
提供这两种方式,但是一般情况下还是使用 xml 的比较方便
小结:
这节内容主要从整体架构上分析了 Mybatis
的架构设计,实际上是对JDBC的做了一些抽取和封装,主要分成了三层
- API接口层
- 数据处理层
- 框架通用模块
MyBatis架构分析的更多相关文章
- (五)myBatis架构以及SQlSessionFactory,SqlSession,通过代理执行crud源码分析---待更
MyBatis架构 首先MyBatis大致上可以分为四层: 1.接口层:这个比较容易理解,就是指MyBatis暴露给我们的各种方法,配置,可以理解为你import进来的各种类.,告诉用户你可以干什么 ...
- 《深入了解mybatis原则》 MyBatis架构设计和案例研究
MyBatis这是现在很流行ORM框架,这是非常强大.事实上现却比較简单.优雅. 本文主要讲述MyBatis的架构设计思路,而且讨论MyBatis的几个核心部件.然后结合一个select查询实例.深入 ...
- Java安全(权限)框架 - Shiro 功能讲解 架构分析
Java安全(权限)框架 - Shiro 功能讲解 架构分析 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 简述Shiro Shiro出自公司Apache(阿帕奇),是java的一 ...
- SLG手游Java服务器的设计与开发——架构分析
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- Activiti架构分析及源码详解
目录 Activiti架构分析及源码详解 引言 一.Activiti设计解析-架构&领域模型 1.1 架构 1.2 领域模型 二.Activiti设计解析-PVM执行树 2.1 核心理念 2. ...
- Mybatis架构原理(二)-二级缓存源码剖析
Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...
- Mybatis架构学习
Mybatis架构学习 MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架.MyBatis 封装了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.可以对配置和原生Map使用 ...
- tomcat架构分析 (Session管理)
Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...
- Magento架构分析,Magento MVC 设计分析
Magento架构分析,Magento MVC 设计分析 分类:Magento 标签:Magento MVC.Magento架构 669人浏览 Magento 采用类似 JAVA的架构,其扩展与稳定性 ...
随机推荐
- 云原生系列1 pod基础
POD解决了什么问题? 成组资源调度问题的解决. mesos采用的资源囤积策略容易出现死锁和调度效率低下问题:google采用的乐观调度技术难度非常大: 而k8s使用pod优雅的解决了这个问题. po ...
- ES6 Map All In One
ES6 Map All In One Map 字典/地图 Set 集合 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referenc ...
- Tailwind CSS in Action
Tailwind CSS in Action Tailwind CSS是一个高度可定制的低级CSS框架,它为您提供了构建定制设计所需的所有构造块,而无需烦恼要覆盖的烦人的自以为是的样式 https:/ ...
- CSS & new class name
CSS & new class name { test: /\.((s*)css|sass)$/, // test: /\.(css|scss|sass)$/, use: ExtractTex ...
- WiFi 测速
WiFi 测速 shit 联通 20M => 电信 20M ? https://zhuanlan.zhihu.com/p/86140645 shit 房东 中国电信网络测速 50M http:/ ...
- 新三板 & 挂牌费用
新三板 & 挂牌费用 关于拟申请公司股票在全国中小企业股份转让系统终止挂牌的提示性公告 https://pilu.tianyancha.com/announcement/ef51e981910 ...
- script async / defer
script async / defer preload / prefetch https://abc.xgqfrms.xyz/ https://javascript.info/script-asyn ...
- Asp.NetCore 3.1demo发布使用Windows服务
Core之Windows服务 使用测试之前,先来简单了解一下 window自带的sc命令 ========install.bat set serviceName=你的服务名称 set serviceF ...
- 应该如何看待VAST的未来价格与价值?
提起数字货币的价格,很多币圈人士都是滔滔不绝,随口一举例,便是百倍千倍的数字货币.可是提起数字货币的价值,就很少有币圈人士能举出几个有力的例子,常常顾左右而言他,场面十分尴尬.之所以会这样,是因为很多 ...
- 近期最值得关注的潜力币种——VAST
近期币圈的热度又再次被掀起,很多新的币种也争相上线,还有一些币种虽然还未上线,但是在币圈的火热程度也非同一般.小编留意了一下,最近在币圈讨论的最火的便是VAST代币.许多生态建设者乃至机构都表示很看好 ...