文章目录
- 前言
- 内容概要
- 第1章 搭建MyBatis源码环境
- 1.1 MyBatis3简介
- 1.2 下载源码并导入IDE
- 1.3 HSQLDB数据库
- (1)准备sql脚本
- (2)引入hsqldb依赖
- (3)编写单元测试
- (4)执行单元测试
- 1.4 小结
前言
笔者作为一名Java开发人员,工作中的项目几乎都将MyBatis作为持久层框架,但笔者对MyBatis框架的理解仅局限于使用,并不理解框架底层的实现原理。
为此,为提升自身编码能力,笔者决定深入学习MyBatis的底层源码,并在CSDN发表学习笔记。
学习参考书是:MyBatis 3源码深度解析 江荣波 清华大学出版社
内容概要
- 第1篇:MyBatis 3源码篇
- 第1章 搭建MyBatis源码环境
- 第2章 JDBC规范详解
- 第3章 MyBatis常用工具类
- 第4章 MyBatis核心组件介绍
- 第5章 SqlSession的创建过程
- 第6章 SqlSession执行Mapper过程
- 第7章 MyBatis缓存
- 第8章 MyBatis日志实现
- 第9章 动态SQL实现原理
- 第10章 MyBatis插件原理及应用
- 第11章 MyBatis级联映射与懒加载
- 第2篇:MyBatis Spring源码篇
- 第12章 MyBatis与Spring整合案例
- 第13章 MyBatis Spring的实现原理
第1章 搭建MyBatis源码环境
1.1 MyBatis3简介
2002年,iBatis框架发布,引入SQL映射;
2010年,iBatis框架改名为MyBatis,迁移到Google Code;
2013年,MyBatis迁移到Github。
目前,Java实现的持久层框架比较多,名气相对较大的有Hibernate、Speedment、Spring Data JPA、ActiveJPA等。
而MyBatis能够流行起来的主要原因有以下几点:
(1)消除了大量的JDBC冗余代码,包括参数设置、结果集封装等。
(2)SQL语句单独写在XML配置文件中,可控制,方便优化。
(3)学习成本比较低,对于新手能够快速学习使用。
(4)提供了与主流IOC框架Spring的集成支持。
(5)引入缓存机制,提供了与第三方缓存类库的集成支持。
1.2 下载源码并导入IDE
mybatis-3项目源码:https://github.com/mybatis/mybatis-3
mybatis-spring项目源码:https://github.com/mybatis/spring
mybatis-parent项目源码:https://github.com/mybatis/parent
三个项目全部克隆到本地后,放在同一文件夹下。源码目录结构如下:
1.3 HSQLDB数据库
比较方便的是,MyBatis源码使用HSQLDB数据库的内存模式作为测试数据库,因此不需要额外安装数据库服务器。
HSQLDB是纯Java语言编写的关系型数据库管理系统,支持大部分SQL-92、SQL:2008、SQL:2011规范。它提供了一个小型的、同时支持内存和磁盘存储表结构的数据库引擎,支持Server模式和内存模式两种运行模式。
HSQLDB的Server模式是把HSQLDB作为一个单独的数据库服务运行,类似于常用的关系型数据库,例如Oracle、MySQL等。
而内存模式则是把HSQLDB嵌入应用进程中,这种模式只能存储应用内部数据。该模式的特点是数据库所有信息都存放在内存中,当HSQLDB进程结束时,数据也会随之丢失,因此这种模式只适合做单元测试。我们需要在HSQLDB进程启动后,额外执行建表语句和数据初始化语句。
由于HSQLDB能够很好地支持JDBC规范,因此可以使用它作为Java语言与关系型数据库交互的测试工具。
下面以一个案例介绍HSQLDB内存模式的使用:
(1)准备sql脚本
代码清单1:create-table.sql
drop table user if exists;
create table user (
id int generated by default as identity,
create_time varchar(20) ,
name varchar(20),
password varchar(36),
phone varchar(20),
nick_name varchar(20),
primary key (id)
);
代码清单2:init-data.sql
insert into user (create_time, name, password, phone, nick_name) values('2024-02-21 10:24:30', 'User1', 'pwd', '18705464523', 'User1');
insert into user (create_time, name, password, phone, nick_name) values('2024-02-21 10:24:30', 'User2', 'pwd', '18705464523', 'User2');
insert into user (create_time, name, password, phone, nick_name) values('2024-02-21 10:24:30', 'User3', 'pwd', '18705464523', 'User3');
insert into user (create_time, name, password, phone, nick_name) values('2024-02-21 10:24:30', 'User4', 'pwd', '18705464523', 'User4');
insert into user (create_time, name, password, phone, nick_name) values('2024-02-21 10:24:30', 'User5', 'pwd', '18705464523', 'User5');
将两个sql文件放到resources目录下。
(2)引入hsqldb依赖
代码清单3:pom.xml
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.15</version>
</dependency>
mybatis中已经包含了hsqldb的依赖。
(3)编写单元测试
代码清单4:Example01.java
public class Example01 {
private Connection conn = null;
@Before
public void initData() {
try {
// 加载HSQLDB驱动
Class.forName("org.hsqldb.jdbcDriver");
// 获取Connection对象
conn = DriverManager.getConnection("jdbc:hsqldb:mem:mybatis", "sa", "");
// 使用Mybatis的ScriptRunner工具类执行数据库脚本
ScriptRunner scriptRunner = new ScriptRunner(conn);
scriptRunner.setLogWriter(null);
scriptRunner.runScript(Resources.getResourceAsReader("create-table.sql"));
scriptRunner.runScript(Resources.getResourceAsReader("init-data.sql"));
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testHsqldbQuery() {
// SqlRunner是Mybatis封装的操作数据库的工具类
SqlRunner sqlRunner = new SqlRunner(conn);
try {
// 调用SqlRunner类的selectAll()方法查询数据
List<Map<String, Object>> results = sqlRunner.selectAll("select * from user");
// 遍历打印查询出的数据
results.forEach(System.out::println);
sqlRunner.closeConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
(4)执行单元测试
{PASSWORD=pwd, PHONE=18705464523, ID=0, CREATE_TIME=2024-02-21 10:24:30, NICK_NAME=User1, NAME=User1}
{PASSWORD=pwd, PHONE=18705464523, ID=1, CREATE_TIME=2024-02-21 10:24:30, NICK_NAME=User2, NAME=User2}
{PASSWORD=pwd, PHONE=18705464523, ID=2, CREATE_TIME=2024-02-21 10:24:30, NICK_NAME=User3, NAME=User3}
{PASSWORD=pwd, PHONE=18705464523, ID=3, CREATE_TIME=2024-02-21 10:24:30, NICK_NAME=User4, NAME=User4}
{PASSWORD=pwd, PHONE=18705464523, ID=4, CREATE_TIME=2024-02-21 10:24:30, NICK_NAME=User5, NAME=User5}
可以看到,HSQLDB中的数据全部被查询了出来。
MyBatis源码中提供了大量的单元测试用例,都使用了HSQLDB的内存模式,不需要额外安装其他数据库就可以运行MyBatis源码中的测试用例。
1.4 小结
第1章到此就梳理完毕了,本章的主题是:搭建MyBatis源码环境。
回顾一下本章的梳理的内容:
(一)MyBatis3的介绍、搭建源码环境、测试数据库HSQLDB
更多内容请查阅分类专栏:MyBatis3源码深度解析
第2章主要梳理:JDBC规范讲解。主要内容包括:
- 2.1 JDBC API简介;
- 2.2 JDBC API中的类与接口;
- 2.3 Connection详解;
- 2.4 Statement详解;
- 2.5 ResultSet详解;
- 2.6 DatabaseMetaData详解;
- 2.7 JDBC事务。