写于:2020-01-01 08:52:37

# 一、什么是 Mybatis

官方文档 给出的说明

MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.

大意如下

  • Mybatis 是一个持久层框架,它支持自定义 SQL ,存储过程 和 高级映射!
  • Mybatis 消除了几乎所有的 JDBC 代码,手动设置参数,结果集提取。
  • Mybatis 可以使用简单的 XML 文件或者 注解来配置和映射原生类型,接口和 POJO 为数据库的记录。

总结:Mybatis 是对 JDBC 的一层轻量级封装。

# 二、Mybatis 的出现

ORM 框架除了 Mybatis,还有 JPA 、Hibernate 等。

在没有 ORM 框架前,与数据库进行交互需要使用到原生的 JDBC 来操作。

# 原生 JDBC 执行查询

需求:通过用户id从 user_info 用户表中查询一条记录

相关代码如下:

Mybatis整体结构分析_JDBC案例

JDBC 进行一个简单的查询需要几个通用步骤:

1、获取链接 Connection 2、根据 SQL 构建预处理对象 PreparedStatement 3、设置 SQL 参数 4、如果需要手动操作事务,还需要开启事务 5、执行 SQL 获取结果集 ResultSet 6、将结果集映射到我们指定的对象中 7、如果手动开启事务,此时需要提交事务 8、关闭连接

# 为提高开发效率进行工具化

JDBC 的操作繁琐,业务开发效率不高。为了提高开发效率,让开发更专注于业务,通常会对这些代码进行抽象。

比如: 1、针对 Connection 的开关操作,进行工具类抽象 2、针对结果集的映射,通过反射进行动态设置。 等。

随着工具类的增多,慢慢便有了 Mybatis 框架的雏形。 1、数据库链接配置等配置信息配置化由程序启动时进行解析。 2、Connection 操作等业务无关的操作对于开发者来说进行透明化。 3、将 SQL 语句和代码进行分离,并进行统一管理 4、通过 Pojo 的方式进行结果集的自动映射等 等。

不断的抽象,演变,整理最终形成了 Mybatis 框架。

# Mybatis 如何执行查询

需求:通过用户id从 user_info 用户表中查询一条记录

# 使用 Mybatis 操作 SQL 前需要维护的代码

Mybatis整体结构分析_Mybatis案例代码图

  • mybatis-config.xml mybatis 配置信息。如:mysql 链接信息,mybatis 运行参数等。

    mybatis-config配置文件

  • domain 文件下的 UserInfo.class Mybatis 进行结果集映射需要的对象

  • UserInfoMapper.xml 维护有执行的 SQL 语句,UserInfo 与 Mysql 映射关系。

    UserInfoMapperxml文件

  • UserInfoMapper.class 提供给用户调用的 API,与 UserInfoMapper.xml 中的 SQL 语句进行关联

以上内容 Mybaits 会进行加载解析然后按照规约存放在指定的对象中。

# 操作执行代码如下:

Mybatis整体结构分析_Mybatis案例

Mybatis 执行SQL语句完成查询需要的步骤: 1、获取 Sqlsession 2、从 Sqlsession 中获取是要的 Mapper.class API接口文件 3、直接调用 Mapper.class 文件进行访问。

当 Mybatis 整合 Spring 之后, Mapper.class 直接托管给了 spring ,代码更简洁了。

# 对比 Mybatis 和 JDBC

JDBC 的查询步骤较为繁琐,步骤较多,代码量也较多。同时有 ResultSet 结果集映射,Preparestatment 处理时的入参设置等都是比较繁琐的。开发效率不高。 Mybatis 对JDBC 结果集的映射、入参的设置做封装,极大的简化了代码量。同时对 sql 文件进行了统一存储,方便统一管理。

不过 Mybatis 同样存在问题,使用 Mybatis 需要维护一定量的配置文件,增加代码复杂度。

但总体来说,利大于弊。

# Mybatis 整体架构

为了解放生产力 在 JDBC 上进行一层层抽象优化,随着抽象内容越来越多,为了使得代码更易于维护,职责更清晰,慢慢的将代码根据细化的职责进行模块化,从而形成 ORM 框架。 而 Mybatis 是其中一个。

Mybatis 抽象模块可以分为三层结构

  • 接口层
  • 核心处理层
  • 基础支持层

如下图:

Mybatis整体结构分析_整体架构图

# 接口层

接口层是用户使用 Mybatis 进行数据库操作的 API 接口。

来看看 SqlSession 接口类图

SqlSession_API类图

该接口层提供了基础的操作 API 1、增(insert)、删(delete)、改(update)、查(select) 提供了基础的自定义 SQL 操作

2、getMapper 能够使用定义好的 Mapper 进行进行查询

3、getConnection、commit、rollback 等 仍然提供 JDBC 原生操作的 API

4、getConfiguration Configuration 可以说整个 Mybatis 最重要的一个对象,里面包含了 Mybatis 几乎所有的内容。 通过 Configuration 可以直接操作 Mybatis 内部。

总的来说:SqlSession 提供了封装好的增删改查的接口,也支持 JDBC 的原生调用 API,也支持 Mybatis 的增删改调用,还支持 Mybatis 更复杂的调用。

# 核心处理层

接口层 SqlSession 提供了 API 入口。而核心处理层的工作就是进行 SQL执行操作并返回结果。 SQL 操作包括但不限于:

  • SQL 参数动态设置
  • 执行 SQL
  • 动态结果集映射

核心处理层的两个关键节点类:

  • Configuration 贯穿整个 Mybatis 框架。拥有 Mybatis 运行过程中的所有基础数据。
  • Executor Executor 的职责就是执行 SQL。

# 基础支持层

基础支持层的功能划分:

1、加载解析配置文件,并抽象为 Java 对象 如:mybatis-config.xml 文件、Mapper.xml 文件 2、附加功能支持 如:缓存策略、日志等。

# 总结

Mybatis 是为了提高开发效率而出现的框架。Mybaits 是一个 JDBC 的封装框架,底层的操作实现仍然是 JDBC。

Mybatis 分为三层:接口层、核心处理层、基础支持层。

每层之间相互关联,或者可以说下层基础决定上层建筑。

最底层的“基础支持层”,将所有配置信息,加载解析并封装到对象中,供其上层“核心处理层”使用。如:缓存策略,日志功能等功能。

“核心处理层” 通过 “基础支持层”提供的基础数据,执行数据库操作,为其上层“接口层”提供了 API 实现。

“接口层” 为用户使用的API层,提供有 原生 JDBC 操作API,Mybatis 操作 API。

精彩内容推送,请关注公众号!
最近更新时间: 3/24/2020, 9:44:42 PM