MyBatis架构设计

340 阅读4分钟

MyBatis官方文档:mybatis.org/mybatis-3/z…

MyBatis简介

1、MyBatis 是一个 半ORM(对象关系映射) 框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。

2、MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

3、通过 xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 MyBatis 框架执行 sql 并将结果映射为 java 对象并返回。(从执行 sql 到返回 result 的过程)。

对象/关系数据库映射(ORM)

ORM全称Object/Relation Mapping: 表示对象-关系映射的缩写

ORM完成面向对象的编程语言到关系数据库的映射。当ORM框架完成映射后,程序员既可以利用面向对象程序设计语言的简单易用性,又可以利用关系数据库的技术优势。ORM把关系数据库包装成面向对象的模型。ORM框架是面向对象设计语言与关系数据库发展不同步时的中间解决方案。采用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象来操作持久化对象,而ORM框架则将这些面向对象的操作转换成底层SQL操作。ORM框架实现的效果:把持久化对象的保持、修改、删除等操作,转换为对数据库的操作。

Mybatis的优势

Mybatis是一个半自动化的持久层框架。

对开发人员而言,核心sql还是需要自己优化,sql和java编码分开,功能边界清晰,一个专注业务,一个专注数据。

Mybaits功能架构设计

将MyBatis的功能架构分为三层

API接口层

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

在Mybatis中,交互分为两种方式:

  • Mybatis提供的API 使用Mybatis提供的API进行操作,通过获取SqlSession对象,然后根据Statement Id 和参数来操作数据库。
    String statement = "com.xx.dao.UserMapper.getUserList";
    List<User> result = sqlsession.selectList(statement); 
    
  • 使用Mapper接口 这也是经常使用的方式,面向接口编程每一个Mapper接口中的方法对应着mapper.xml文件中的一个select/insert/update/delete节点。节点中的ID就是接口中的方法名,在使用的时候直接调用接口方法即可。不过,值得注意的是,它最终执行的还是sqlSession.select()、sqlSession.delete()。
    public interface UserMapper {
      
      //userMappper.findUser(1);
      User findUser(int id);
    
    }
    

数据处理层

这是Mybatis的核心。负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。关于参数映射和结果集转换,主要是靠typeHandlers

基础支撑层

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

MyBatis层次结构

构件描述
SqlSession作为Mybatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
ExecutorMybatis执行器,是Mybatis调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler封装了JDBC Statement操作,负责对JDBC statement的操作,如设置参数、将Statement结果集转换成List集合
ParameterHandler负责对用户传递的参数转换成JDBC Statement所需要的参数
ResultSetHandler负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
TypeHandler负责Java数据类型和jdbc数据类型之间的映射和转换
NaooedStatementMappedStatement维护了一条<select | update | delete | insert>节点的封装
SqlSource负责根据用户传递的parameterObject,动态的生成SQL语句,将信息封装到BoundSql对象中,并返回
BoundSql表示动态生成的SQL语句以及相应的参数信息
ConfigurationMybatis所有的配置信息都维护在此对象之中