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对象。