Mybatis架构与原理

1、简介

MyBatis 是一款优秀的持久层框架。MyBatis 避免了几乎全部的 JDBC 代码和手动设置参数以及获取结果集java

Mybatis能够将Sql语句配置在XML文件中,避免将Sql语句硬编码在Java类中。与JDBC相比:数据库

  1. Mybatis经过参数映射方式,能够将参数灵活的配置在SQL语句中的配置文件中,避免在Java类中配置参数(JDBC)
  2. Mybatis经过输出映射机制,将结果集的检索自动映射成相应的Java对象,避免对结果集手工检索(JDBC)
  3. Mybatis能够经过Xml配置文件对数据库链接进行管理。

2、架构

咱们把Mybatis的功能架构分为三层:缓存

(1)API接口层:提供给外部使用的接口API,开发人员经过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。安全

(2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操做。session

(3)基础支撑层:负责最基础的功能支撑,包括链接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来做为最基础的组件。为上层的数据处理层提供最基础的支撑。架构

 

3、层次结构

  • SqlSession 做为MyBatis工做的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
  • Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
  • StatementHandler 封装了JDBC Statement操做,负责对JDBCstatement的操做,如设置参数、将Statement结果集转换成List集合。
  • ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所须要的参数
  • ResultSetHandler *负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
  • TypeHandler 负责java数据类型和jdbc数据类型之间的映射和转换
  • MappedStatement MappedStatement维护了一条<select|update|delete|insert>节点的封
  • SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
  • BoundSql 表示动态生成的SQL语句以及相应的参数信息
  • Configuration MyBatis全部的配置信息都维持在Configuration对象之中

4、核心类

一、SqlSessionFactoryBuilder

每个MyBatis的应用程序的入口是SqlSessionFactoryBuilder。app

它的做用是经过XML配置文件建立Configuration对象(固然也能够在程序中自行建立),而后经过build方法建立SqlSessionFactory对象。没有必要每次访问Mybatis就建立一次SqlSessionFactoryBuilder,一般的作法是建立一个全局的对象就能够了框架

二、SqlSessionFactory

由SqlSessionFactoryBuilder建立
它的主要功能是建立SqlSession对象,和SqlSessionFactoryBuilder对象同样,没有必要每次访问Mybatis就建立一次SqlSessionFactory,一般的作法是建立一个全局的对象就能够了。SqlSessionFactory对象一个必要的属性是Configuration对象,它是保存Mybatis全局配置的一个配置对象,一般由SqlSessionFactoryBuilder从XML配置文件建立

三、SqlSession

SqlSession对象的主要功能是完成一次数据库的访问和结果的映射,它相似于数据库的session概念,因为不是线程安全的,因此SqlSession对象的做用域需限制方法内。SqlSession的默认实现类是DefaultSqlSession,它有两个必须配置的属性:Configuration和Executor。Configuration前文已经描述这里再也不多说。SqlSession对数据库的操做都是经过Executor来完成的

四、Executor

Executor对象在建立Configuration对象的时候建立,而且缓存在Configuration对象里。Executor对象的主要功能是调用StatementHandler访问数据库,并将查询结果存入缓存中(若是配置了缓存的话)。ui

五、StatementHandler

StatementHandler是真正访问数据库的地方,并调用ResultSetHandler处理查询结果。编码

六、ResultSetHandler

处理查询结果。

相关文章
相关标签/搜索