MyBatis源码分析(一)MyBatis整体架构分析

文章目录

  • 一、为什么要用MyBatis
    • 1、原始JDBC的痛点
    • 2、Hibernate 和 JPA
    • 3、MyBatis的特点
    • 4、MyBatis整体架构
    • 5、MyBatis主要组件及其相互关系
    • 6、MyBatis源码的特点
  • 二、源码环境搭建
  • 未完待续

一、为什么要用MyBatis

1、原始JDBC的痛点

在传统JDBC场景下,SQL 夹杂在Java代码中耦合度高,导致硬编码内伤。并且维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见,更何况代码冗长,开发效率低。

MyBatis源码分析(一)MyBatis整体架构分析_第1张图片

工作时间比较长的小伙伴,或者参与过老项目的小伙伴们,对下面的代码肯定不陌生。

Connection conn = null;
try {
    Class.forName("com.mysql.jdbc.Driver");// 加载驱动
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
conn = DriverManager.getConnection("url");
PreparedStatement pst = null;
try {
    conn.setAutoCommit(false);
    pst = conn.prepareStatement("select * from user");
    ResultSet resultSet = pst.executeQuery();
    // 循环操作resultSet获取每行每列的数据。。。。
    conn.commit();
} catch (SQLException e) {
    e.printStackTrace();
    try {
        conn.rollback();
    } catch (SQLException e1) {
        e1.printStackTrace();
    }
} finally {
    try {
        if (pst != null) pst.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

所以,市面上有很多数据库的操作工具,都在尽可能的封装JDBC这一套流程,使开发人员可以更专注于业务开发。

MyBatis也不例外,都绕不开这一套JDBC的操作流程。

2、Hibernate 和 JPA

  • 操作简便,开发效率高
  • 程序中的长难复杂 SQL 需要绕过框架
  • 内部自动生产的 SQL,不容易做特殊优化
  • 基于全映射的全自动框架,大量字段的POJO 进行部分映射时比较困难。
    • 反射操作太多,导致数据库性能下降

3、MyBatis的特点

  • 轻量级,性能出色 SQL 和 Java 编码分开,功能边界清晰。
  • Java代码专注业务、SQL语句专注数据
  • 开发效率稍逊于Hibernate,但是完全能够接受

MyBatis提供的可以自定义复杂sql的机制,可以完美的结合sql优化,应对当前环境数据多查询慢的情况。

所以说,MyBatis 是一个 半自动的ORM(Object Relation Mapping) 框架。

4、MyBatis整体架构

MyBatis源码分析(一)MyBatis整体架构分析_第2张图片

mybatis架构四层作用:
Api接口层:提供API 增加、删除、修改、查询等接口,通过API接口对数据库进行操作。
数据处理层:主要负责SQL的 查询、解析、执行以及结果映射的处理,主要作用解析sql根据调用请求完成一次数据库操作.
框架支撑层:负责通用基础服务支撑,包含事务管理、连接池管理、缓存管理等共用组件的封装,为上层提供基础服务支撑.
引导层:引导层是配置和启动MyBatis 配置信息的方式

5、MyBatis主要组件及其相互关系

MyBatis源码分析(一)MyBatis整体架构分析_第3张图片

SqlSession:是Mybatis对外暴露的核心API,提供了对数据库的DRUD操作接口。
Executor:执行器,由SqlSession调用,负责数据库操作以及Mybatis两级缓存的维护
StatementHandler:封装了JDBC Statement操作,负责对Statement的操作,例如PrepareStatement参数的设置以及结果集的处理。
ParameterHandler:是StatementHandler内部一个组件,主要负责对ParameterStatement参数的设置
ResultSetHandler:是StatementHandler内部一个组件,主要负责对ResultSet结果集的处理,封装成目标对象返回
TypeHandler:用于Java类型与JDBC类型之间的数据转换,ParameterHandler和ResultSetHandler会分别使用到它的类型转换功能
MappedStatement:是对Mapper配置文件或Mapper接口方法上通过注解申明SQL的封装
Configuration:Mybatis所有配置都统一由Configuration进行管理,内部由具体对象分别管理各自的小功能模块

6、MyBatis源码的特点

MyBatis的源码不像Spring的源码那样,注释写的并没有很清楚明白。

而且提供的扩展点确实也有限,不过对于开发人员却也是足够了。
所以,很多公司推出了MyBatis-Plus来对MyBatis进行了增强,由于MyBatis的扩展机制较差,MyBatis-Plus几乎所有的扩展点都是对MyBatis源码的复写,而不是通过接口来扩展。

MyBatis源码可以说是略有瑕疵,虽比不上Spring,但是也是目前最好用的ORM框架之一了。

不同版本MyBatis源码可能会稍有不同,但是主流程是差不多的,思想是没有变化的。

二、源码环境搭建

mybatis源码地址:https://github.com/mybatis/mybatis-3

或者根据官方文档,编写测试代码进行测试:https://mybatis.org/mybatis-3/zh/getting-started.html

我们就直接按照官方文档的方式,进行源码分析。

未完待续

你可能感兴趣的:(#,spring,boot,cloud,mybatis,架构,java)