Mybatis核心组件初识

Mybatis简介

tips: 阅读本篇文章前作者默认读者对JDBC有一定的了解,不再过多介绍JDBC相关核心概念。

Mybatis作为一个轻量级的ORM框架,对JDBC做了一系列的封装,最终使得java应用能够很方便的与关系型数据库进行交互。其核心组件交互图如下所示,后续系列文章也围绕该交互图展开介绍。

如上图所示,SqlSession是Mybatis提供的与客户端交互的API。SqlSession是Executor组件的封装,实际上真正与数据库交互的是Executor组件,这也是外观模式的一种典型应用。

Executor是Sql的执行器,通过StatementHandler对JDBC的Statement对象进行操作,当statement为ParamterStatement或CallableStatement对象时,通过ParameterHandler为sql进行参数占位符值填充,ParamterStatement会通过java对象的类型找到对应的TypeHandler,相对应的TypeHandler会通过statement的setXXX()方法为sql进行参数占位符填充。执行sql之后通过ResultSetHandler从statement中获取ResultSet,之后将ResultSet转换为java对应的对象,之后返回。

接下来一一介绍Mybatis中的核心组件,目的是对Mybatis核心组件有一个初步认知,后续文章会将这些组件串接起来让读者有一个完整的认知。

Configuration

Configuration是Mybatis的核心类,该类主要有以下三个功能。

1. 解析Mybatis的主配置文件信息,将主配置文件中对应的setting配置信息放入相对应的属性中。如下面这些属性值。这些属性值是MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

以上属性值均可在官网查到对应的释义。配置_MyBatis中文网

一个完整的示例为:

2. 作为TypeHander,TypeAlias,InterCeptorChain,MappedStatement等组件的容器。这些容器在Mybatis启动时注册到Configuration类中。

3. 作为Executor、StatementHandler、ResultSetHandler、ParameterHandler组件的工厂类,用于创建这些组件的实例。

Executor

Executor接口定义了对数据库的增删改查等方法。

其有以下几个实现类

BaseExecutor直接实现Executor,对相关方法做了通用实现,其具体方法由BatchExecutor、SimpleExecutor及ResueExecutor这些子类实现。这是典型的模板模式应用。 如Executor的update方法,其真正执行doUpdate由各个子类具体实现。

SimpleExecutor是基础的Executor,可以完成基本的增删改查操作,ReuseExecutor对JDBC的statement对象做了缓存,这是享元思想的应用。其代码如下所示,先在缓存中查找有没有statement对象,如果没有再生成statement,生成之后放入缓存。

BatchExecutor是通过JDBC的addBatch ()和executeBatch ()方法来实现的,可以将一组SQL语句打包在一起执行,减少了 数据库 连接的建立和关闭次数,从而提高了批量操作的效率。

CachingExecutor是对BatchExecutor、SimpleExecutor及ResueExecutor的装饰类,当启用二级缓存时用该Executor。如下所示,CachingExecutor持有Executor的具体实现。这是典型的装饰器模式。

StatementHandler

StatementHandler封装了对JDBC Statement的操作,接口定义如下

通过prepare获取Statement,通过paramterize为参数占位符设置值,通过batch将sql命令添加到批处理列表中,通过update,query,queryCursor对sql语句执行操作,通过getBoundSql获取动态SQL解析后的SQL文本和参数映射信息,通过getParamterHandler获取ParameterHandler的实例。

其实现类如下所示:

其中BaseStatementHandler作为抽类,SimpleStatementHandler、CallableStatementHandler及PreparedStatementHandler对BaseStatementHandler进行实现,和Executor类似,是模板模式的具体体现。 RoutingStatement则根据Mapper中statementType的不同属性选择具体的StatementHandler实现类,这是工厂模式的体现。

MappedStatement

MappedStatement对象用来描述Sql的Mapper相关信息,其属性值均可在官网查到定义 XML 映射器_MyBatis中文网

TypeHandler

TypeHandler作为映射器,对JDBC类型和Java类型做对应的转换,当sql语句执行之后获取ResultSet对象,调用ResultSet的getXXX()方法,会将对应的JDBC类型准换为Java类型。同样在statement对象为参数占位符设置值的时候,调用statement对象的setXXX()将对应的java类型转换为JDBC类型。

TypeHandler的实现类非常多,分别对应各种类型的相互转换。 具体对应实现类可以在官网中查阅配置_MyBatis中文网

ParameterHandler

当使用PreparedStatement或者CallableStatement对象时,如果SQL语句中有参数占位符,在执行SQL语句之前,就需要为参数占位符设置值。ParameterHandler的作用是在PreparedStatementHandler和CallableStatementHandler操作对应的Statement执行数据库交互之前为参数占位符设置值。

ResultSetHandler

ResultSetHandler用于在StatementHandler对象执行完查询操作或存储过程后,对结果集或存储过程的执行结果进行处理。

总结

Configuration的作用是描述MyBatis主配置文件信息,当MyBatis启动时会加载主配置文件,将配置信息转换为Configuration对象。

SqlSession:是Executor的外观,客户端通过与Sqlseesion交互实现与Executor的交互。

Executor:SQL执行器,用于和数据库交互。

MappedStatement:用于描述SQL配置信息,MyBatis的XML文件或者注解配置的SQL信息会被转换为MappedStatement对象注册到Configuration中。

StatementHandler:封装了对Statement对象的操作。

ParameterHandler:为SQL中为参数占位符设置值。

ResultSetHandler:封装了对ResultSet的操作,可以将结果集转换为Java对象。

相关推荐
弗拉唐5 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
凌冰_6 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
Elaine2023918 小时前
零碎04 MybatisPlus自定义模版生成代码
java·spring·mybatis
一二小选手8 小时前
【MyBatis】全局配置文件—mybatis.xml 创建xml模板
xml·java·mybatis
刘大浪9 小时前
后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用
数据库·spring boot·mybatis
蓝染-惣右介11 小时前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis
武子康12 小时前
Java-07 深入浅出 MyBatis - 一对多模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据库·sql·mybatis·springboot
一二小选手12 小时前
【Mybatis】@Param注解 resultMap手动映射
java·mybatis
郑祎亦15 小时前
Spring Boot 项目 myblog 整理
spring boot·后端·java-ee·maven·mybatis