[一天一个进阶系列] - MyBatis基础篇
前言:一直以来,很多人都是拿来主义,只停留在会使用的阶段,从未去研究挖掘其原理,剖析本质。现在慢慢探讨一下其内幕,抛砖引玉
一、简介
1)常用的持久化框架
Hibernate:是一款Java世界中最著名的ORM框架之一JPA(Java Persistence API): 是EJB 3 .0中持久化部分的规范,但它可以脱离EJB的体系单
独作为一个持久化规范进行使用Spring JDBC:严格来说,Sring JDBC不能算是一个ORM架,它仅仅是使用模板方式对原生DBC行了一层非常薄的封装MyBatis:MyBatis前身是Apache基金会的开源项目iBatis,在2010 年该项目脱离Apache基金会并正式更名为MyBatis
2)使用步骤
- 传统的
JDBC编程中的查询操作为例进行说明,其主要步骤如下:- 注册数据库驱动类 ,明确指定数据库
URL地址、数据库用户名、密码等连接信息
- 注册数据库驱动类 ,明确指定数据库
- 通过
DriverManager打开数据库连接
- 通过
- 通过数据库连接创建
Statement对象
- 通过数据库连接创建
- 通过
Statement对象执行SQL语句,得到ResultSet对象
- 通过
- 通过
ResultSet读取数据,并将数据转换成JavaBean对象
- 通过
- 关闭
ResultSet、Statement对象以及数据库连接,释放相关资源
- 关闭
java操作数据库
- 使用
MyBatis,其主要步骤如下:- 配置
mybatis-config.xml配置文件, 配置数据库的URL地址、数据库用户名和密码、别名信息、映射配置文件的位置以及一些全局配置信息
- 配置
- 应用程序首先会加载
mybatis-config.xml配置文件
- 应用程序首先会加载
- 井根据配置文件的内容创建
SqlSessionFactory对象
- 井根据配置文件的内容创建
- 通过
SqlSessionFactory对象创建SqlSession对象,SqlSession接口中定义了执行SQL语句所需要的各种方法
- 通过
- 通过
SqlSession对象执行映射配置文件中定义的SQL语句,完成相应的数据操作
- 通过
- 通过
SqlSession对象提交事务,关闭SqlSession对象
- 通过
3)Mybatis整体架构
- 整体结构图
- 一条sql大致的执行过程
① 基础支持层
反射模块
- 反射工具箱:在进行参数处理、结果映射等操作时,会涉及大量的反射操作,
Java中的反射虽然功能强大,但是代码编写起来比较复杂且容易出错,为了简化反射操作的相关代码,MyBatis提供了专门的反射模块,该模块位于org.apache.ibatis.reflection包中,它对常见的反射操作做了进一步封装,提供了更加简洁方便的反射API
- 反射工具箱:在进行参数处理、结果映射等操作时,会涉及大量的反射操作,
类型转换模块
- 功能
- 别名机制
- 转换机制:在为
SQL语句绑定实参时, 会将数据由Java类型转换成JDBC类型;而在映射结果集时,会将数据由JDBC类型转换成 Java 类型
- 转换机制:在为
- 功能
日志模块:
- 功能
- 提供详细的日志输出信息
- 集成第三方日志框架
- 功能
资源加载模块
- 功能
- 对类加载器进行封装,确定类加载器的使用顺序
- 提供了加载类文件以及其他资源文件的功能
- 功能
解析器模块
- 功能
- 对
XPath进行封装,为MyBatis初始化时解析mybatis-config.xml配置文件以及映射配置文件提供支持
- 对
- 为处理动态
SQL语句中的占位符提供支持
- 为处理动态
- 功能
数据源模块:提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中
事务管理:对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现,与
Spring框架集成,并由Spring框架管理事务,缓存模块
- 功能
- 提供一级缓存和二级缓存
- 简单的缓存使用图
注意:MyBatis中自带的这两级缓存与MyBatis以及整个应用是运行在同一个JVM中的,共享同一块堆内存。如果这两级缓存中的数据量较大, 则可能影响系统中其他功能的运行,所以当需要缓存大量数据时 ,优先考虑使用Redis、Memcache等缓存产品
Binding模块:MyBatis通过Binding模块将用户自定义的Mapper接口与映射配置文件关联起来,系统可以通过调用自定义Mapper接口中的方法执行相应的SQL语句完成数据库操作,开发人员无须编写自定义Mapper接口的实现,MyBatis会自动为其创建动态代理对象
② 核心处理层
- 配置解析
- 在
MyBatis初始化过程中,会加载mybatis-config.xml配置文件、映射配置文件以及Mapper接口中的注解信息,解析后的配置信息会形成相应的对象并保存到Configuration对象中
- 在
SOL解析与scripting模块- 为了将开发人员从这项枯燥无趣的工作中解脱出来,
MyBatis实现动态SQL语句的功能,提供了多种动态SQL语句对应的节点 scripting模块会根据用户传入的实参,解析映射文件中定义的动态SQL节点,并形成数据库可执行的SQL语句 。之后会处理SQL语句中的占位符,绑定用户传入的实参
- 为了将开发人员从这项枯燥无趣的工作中解脱出来,
SOL执行:语句的执行涉及多个组件 ,其中比较重要的是Executor、StatementHandler、ParameterHandler和ResulSetHandler,步骤如下:Executor主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作 ,它会将数据库相关操作委托给StatementHandler完成
StatementHandler首先通过ParameterHandler完成SQL语句的实参绑定,然后通过java.sql.Statement对象执行SQL语句并得到结果集
- 最后通过
ResultSetHandler完成结果集的映射,得到结果对象并返回
- 最后通过
- 插件:可以通过添加用户自定义插件的方式对
MyBatis进行扩展,用户自定义插件也可以改变Mybatis的默认行为
③ 接口层
- 接口层相对简单,其核心是
SqlSession接口,该接口中定义了MyBatis暴露给应用程序调用的API,也就是上层应用与MyBatis交互的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作
总结
- 本篇简单介绍了 MyBatis 整体架构及各层之间的功能。若要用好并深入,请关注下一篇原理剖析篇
[一天一个进阶系列] - MyBatis基础篇的更多相关文章
- 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)
背景 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...
- 【webpack 系列】基础篇
Webpack 基础篇 基本概念 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器.当 webpack 处理应用程序时,它会递归地构建一个依赖关系图,其中包含应用程序需要的每 ...
- SQL系列总结——基础篇(三)
之前的两篇文章SQL系列总结:<基础篇一>, <基础篇二>已经介绍了一些基本的数据库知识.现在让我们来从头开始构建一个数据库.到管理数据库和对象. 架构开始! 1.创建 ...
- SQL系列总结——基础篇(一)
数据库与表.列的关系其实就像是一个Excel工作薄(workbook)与Excel表格(sheet)以及表格中的列的关系一样.关系数据库中最基本的对象有3个:表.列.用户 基本的概念名词 ...
- Android自定义控件系列之基础篇
一.概述 在android开发中很多UI控件往往需要进行定制以满足应用的需要或达到更加的效果,接下来就通过一个系列来介绍自定义控件,这里更多是通过一些案例逐步去学习,本系列有一些典型的应用,掌握好了大 ...
- docker进阶之路-基础篇 | 一:环境搭建
转载请注明作者及出处: 作者:银河架构师 原文链接:https://www.cnblogs.com/luas/p/12061747.html 一.准备工作 查看内核 Docker 要求 CentOS ...
- docker进阶之路-基础篇 | 二:portainer安装与基本使用
转载请注明作者及出处: 作者:银河架构师 原文链接:https://www.cnblogs.com/luas/p/12061755.html 简介 Portainer 是轻量级,跨平台,开源的管理D ...
- 深入理解javascript函数进阶系列第三篇——函数节流和函数防抖
前面的话 javascript中的函数大多数情况下都是由用户主动调用触发的,除非是函数本身的实现不合理,否则一般不会遇到跟性能相关的问题.但在一些少数情况下,函数的触发不是由用户直接控制的.在这些场景 ...
- [AngularJS] AngularJS系列(1) 基础篇
目录 什么是AngularJS? 为什么使用/ng特性 Hello World 内置指令 内置过滤器 模块化开发 一年前开始使用AngularJS(以后简称ng),如今ng已经出2了.虽说2已完全变样 ...
随机推荐
- JDBC UPDATE误区
1 package com.lykion; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import ...
- swap是干嘛的?
本文截取自:http://hbasefly.com/2017/05/24/hbase-linux/ swap是干嘛的? 在Linux下,SWAP的作用类似Windows系统下的"虚拟内存&q ...
- IdentityServer4 之Client Credentials走起来
前言 API裸奔是绝对不允许滴,之前专门针对这块分享了jwt的解决方案(WebApi接口裸奔有风险):那如果是微服务,又怎么解决呢?每一个服务都加认证授权也可以解决问题,只是显得认证授权这块冗余,重复 ...
- Refit集成consul在asp.net core中的实践
前言 github:https://github.com/alphayu/ Refit.WebApiClient.Feign等都是支持声名式的Restful服务调用的开源组件. 这个几个组件都综合研究 ...
- 注意力论文解读(1) | Non-local Neural Network | CVPR2018 | 已复现
文章转自微信公众号:[机器学习炼丹术] 参考目录: 目录 0 概述 1 主要内容 1.1 Non local的优势 1.2 pytorch复现 1.3 代码解读 1.4 论文解读 2 总结 论文名称: ...
- 漫画|web的主要安全问题
在此主要说现在市面上存在的4个比较多的安全问题 一.钓鱼 钓鱼: 比较有诱惑性的标题 仿冒真实网站 骗取用户账号 骗取用户资料 二.篡改页面 有一大部分被黑的网站中会有关键字 (在被黑的网站中,用的最 ...
- ABP vNext 自动注入,暗藏天坑如斯
导言 我们在使用ABP vNext框架时,都知道该框架为我们实现了自动依赖注入(实现自动注入需要在项目里面创建Module类,并且将Module类上的DependsOn到相应的启动Module类或调用 ...
- 安装SVN和汉化包及基本使用
官网下载程序 和 下载汉化包. https://tortoisesvn.net/ 注意SVN汉化包版本需要和SVN版本一致,否则是无效的. 一.下载 1.进入官网,点击downloads 2.点击 ...
- 【Java】变量
变量 文章目录 变量 1.变量的概念 2.变量的三要素 3.变量的使用应该注意什么? 4.变量的声明和赋值.使用的语法格式? 5.code 1.变量的概念 变量的作用:变量用来存储数据. 变量的本质: ...
- 【Spring】Spring中的Bean - 1、Baen配置
Bean配置 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 什么是Spring中的Bean? Spring可以被看作是一个 ...