MyBatis3源码深度解析(一)搭建MyBatis源码环境

前言

笔者作为一名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

三个项目全部克隆到本地后,放在同一文件夹下。源码目录结构如下:

mybatis源码目录结构

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脚本

代码清单1create-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)编写单元测试

代码清单4Example01.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事务。
  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰色孤星A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值