文章目录
- 一、为什么要用MyBatis
- 1、原始JDBC的痛点
- 2、Hibernate 和 JPA
- 3、MyBatis的特点
- 4、MyBatis整体架构
- 5、MyBatis主要组件及其相互关系
- 6、MyBatis源码的特点
- 二、源码环境搭建
- 未完待续
一、为什么要用MyBatis
1、原始JDBC的痛点
在传统JDBC场景下,SQL 夹杂在Java代码中耦合度高,导致硬编码内伤。并且维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见,更何况代码冗长,开发效率低。
工作时间比较长的小伙伴,或者参与过老项目的小伙伴们,对下面的代码肯定不陌生。
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架构四层作用:
Api接口层:提供API 增加、删除、修改、查询等接口,通过API接口对数据库进行操作。
数据处理层:主要负责SQL的 查询、解析、执行以及结果映射的处理,主要作用解析sql根据调用请求完成一次数据库操作.
框架支撑层:负责通用基础服务支撑,包含事务管理、连接池管理、缓存管理等共用组件的封装,为上层提供基础服务支撑.
引导层:引导层是配置和启动MyBatis 配置信息的方式
5、MyBatis主要组件及其相互关系
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
我们就直接按照官方文档的方式,进行源码分析。