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

文章目录

    • 前言
    • 内容概要
  • 第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

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

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事务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/399225.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线阵相机参数介绍之轴编码器控制

1.1 功能介绍 编码器是将检测对象的运动与相机拍摄取图相匹配的设备&#xff0c;也即检测对象运动一定距离&#xff0c;相机就拍摄一定行高的图像。 编码器会将检测对象的实际位移转换为固定数量电信号。例如&#xff1a;编码器的精度是2000p/r,该参数的含义是编码器每转一圈输…

5款超好用、高颜值的Git可视化工具

Git&#xff0c;作为一款强大的分布式版本控制系统&#xff0c;为代码协作与版本追踪提供了坚实的基础。然而&#xff0c;对于不熟悉命令行操作的新手或寻求更直观体验的开发者来说&#xff0c;Git的可视化工具成为了不可或缺的得力助手。本文将分享五款超好用、高颜值的Git可视…

【微服务生态】Docker

文章目录 一、基础篇1. 简介2. 下载与安装3. 常用命令3.1 帮助启动类3.2 镜像命令3.3 容器命令 4. Docker 容器数据券5. Docker 镜像5.1 commit 生成镜像5.2 Docker Registry5.3 发布镜像 6. Docker 常规安装软件 二、高级篇1. Dockerfile1.1 概述1.2 基础知识1.3 Dockerfile常…

Zabbix 远程监控主机

目录 1、安装 Zabbix 安装客户端 服务端测试通讯 Web页面添加主机 2、监控 Nginx 自定义脚本监控 Nginx web配置台 3、监控 MySQL 配置模版文件 配置Web界面 1、安装 Zabbix node-12 作为zabbix的被监控端&#xff0c;提供mysql服务器&#xff0c;配置zabbix监控node…

汽车电子论文学习--电动汽车电机驱动系统动力学特性分析

关键重点&#xff1a; 1. 汽车的低速转矩存在最大限制&#xff0c;受附着力限制&#xff0c;因路面不同而变化。 2. 起步加速至规定转速的时间可以计算得到&#xff1a; 3. 电机额定功率的计算方式&#xff1a; 可以采取最高设计车速90%或120km/h匀速行驶的功率作为电机额定功…

机器学习基础(三)监督学习的进阶探索

导语&#xff1a;上一节我们深入地探讨监督学习和非监督学习的知识&#xff0c;重点关注它们的理论基础、常用算法及实际应用场景&#xff0c;详情可见&#xff1a; 机器学习基础&#xff08;二&#xff09;监督与非监督学习-CSDN博客文章浏览阅读769次&#xff0c;点赞15次&a…

【AI工具分享】Retrovision一个图片转3D模型在线工具

Retrovision:图像到3D模型的快速转换工具 一、工具简介 Retrovision是一款前沿的web应用程序,致力于将传统的2D图像快速、简便地转换为高质量的3D模型。其核心功能围绕视差图处理与3D网格生成,为3D内容创作者提供了一个全新的创作平台。 二、核心功能 视差图支持:Retrov…

maven打包scala程序

pom文件打包scala程序 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&g…

快速上手Spring Boot整合,开发出优雅可靠的Web应用!

SpringBoot 1&#xff0c;SpringBoot简介1.1 SpringBoot快速入门1.1.1 开发步骤1.1.1.1 创建新模块1.1.1.2 创建 Controller1.1.1.3 启动服务器1.1.1.4 进行测试 1.1.2 对比1.1.3 官网构建工程1.1.3.1 进入SpringBoot官网1.1.3.2 选择依赖1.1.3.3 生成工程 1.1.4 SpringBoot工程…

前端进度条组件NProgress

nprogress 安装 npm install --save nprogress使用 import NProgress from nprogress // 引入nprogress插件 import nprogress/nprogress.css // 这个nprogress样式必须引入// axios请求拦截器 axios.interceptors.request.use(config > {NProgress.start() // 设置加载进…

CSS三大定位方式(浮动、定位、弹性盒)详细解析

CSS三大定位方式 前言&#xff1a;作为一名前端开发&#xff0c;已经工作2年了。由于自己是半路出家&#xff0c;从嵌入式方向转到前端开发&#xff0c;都是边百度边开发&#xff0c;很多基础都不了解&#xff0c;只要解决问题就好&#xff0c;但是近来为了让自己知识体系化&a…

Nginx 反向代理配置

Nginx就不废话了&#xff0c;web服务器。 最近在备案一个域名&#xff0c;想要备案&#xff0c;部署一个服务器&#xff0c;平常很少自己配置Nginx&#xff0c;今天记录下。 1、反向代理 正向代理 指 客户端通过代理访问后端服务 反向代理 指 服务器推出一个客户&#xff0…

Git 使用教程

一、Git的认识 1.1版本控制 什么是“版本控制”&#xff1f;我为什么要关心它呢&#xff1f; 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 a) 还原&#xff1a;如果你是程序开发者&#xff0c;在新写一个促销活动的java文…

Elasticsearch:创建自定义 ES Rally tracks 的分步指南

作者&#xff1a;Alejandro Snchez 按照这个综合教程学习如何制作个性化的 Rally tracks ES Rally 是什么&#xff1f;它的用途是什么&#xff1f; ES Rally 是一个用于在 Elasticsearch 上测试性能的工具&#xff0c;允许你运行和记录比较测试。 做出决策可能很困难&#x…

电脑开机启动项在哪里设置?优化系统速度不是梦!

电脑的开机启动项设置直接影响着系统启动的速度和性能&#xff0c;合理配置启动项可以提高系统的启动速度&#xff0c;同时确保开机时运行的程序符合个人需求。那么&#xff0c;电脑开机启动项在哪里设置呢&#xff1f;本文将详细介绍电脑开机启动项设置的三种方法&#xff0c;…

helm部署gitlab-runner问题解决

关于.gitlab-ci.yml中build镜像时&#xff0c;docker守护进程未启动错误 参考&#xff1a;https://docs.gitlab.com/runner/install/kubernetes.html 问题截图 解决方法 values.yaml中关于conf.toml添加 注意&#xff1a;确保每个节点的docker正常运行 [[runners.kubernetes…

week04day01(爬虫)

一. 爬虫 只爬取公开的信息&#xff0c;不能爬取未公开的后台数据 1.爬虫的合法性 法无禁止皆可为 -- 属于法律的灰色地带https://www.tencent.com/robots.txt -- 网站/robots.txt 可以查看禁止爬取的内容 2. URL Uniform Resource Locator 统一资源定位符https://www.…

2024年黑龙江省考公告出来了,招7768人,速速查收报名流程!

✔️报名时间&#xff1a;2024年2月19日9:00至2月23日17:00 ✔️资格审查时间&#xff1a;至2024年2月23日17:00 ✔️缴费时间&#xff1a;至2024年2月25日09&#xff1a;00 ✔️打印准考证时间&#xff1a;2024年3月12日9&#xff1a;00至3月17日9&#xff1a;00 ✔️公共科目…

多线程相关(1)

线程调度 线程状态&#xff1a;状态切换阻塞与唤醒阻塞唤醒 wait 与 sleep创建线程方式 线程是cpu任务调度的最小执行单位&#xff0c;每个线程拥有自己独立的程序计数器、虚拟机栈、本地方法栈。 线程状态&#xff1a; 线程状态包括&#xff1a;创建、就绪、运行、阻塞、死亡…

Leetcode刷题笔记题解(C++):203. 移除链表元素

思路&#xff1a;不同的情况出现了&#xff0c;就是第一个节点要是为等于val的节点&#xff0c;可以新建一个节点&#xff0c;并next指向head&#xff0c;这样就可以遍历新的链表来删除节点 /*** Definition for singly-linked list.* struct ListNode {* int val;* L…