赞
踩
笔者作为一名Java开发人员,工作中的项目几乎都将MyBatis作为持久层框架,但笔者对MyBatis框架的理解仅局限于使用,并不理解框架底层的实现原理。
为此,为提升自身编码能力,笔者决定深入学习MyBatis的底层源码,并在CSDN发表学习笔记。
学习参考书是:MyBatis 3源码深度解析 江荣波 清华大学出版社
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)引入缓存机制,提供了与第三方缓存类库的集成支持。
mybatis-3项目源码:https://github.com/mybatis/mybatis-3
mybatis-spring项目源码:https://github.com/mybatis/spring
mybatis-parent项目源码:https://github.com/mybatis/parent
三个项目全部克隆到本地后,放在同一文件夹下。源码目录结构如下:
比较方便的是,MyBatis源码使用HSQLDB数据库的内存模式作为测试数据库,因此不需要额外安装数据库服务器。
HSQLDB是纯Java语言编写的关系型数据库管理系统,支持大部分SQL-92、SQL:2008、SQL:2011规范。它提供了一个小型的、同时支持内存和磁盘存储表结构的数据库引擎,支持Server模式和内存模式两种运行模式。
HSQLDB的Server模式是把HSQLDB作为一个单独的数据库服务运行,类似于常用的关系型数据库,例如Oracle、MySQL等。
而内存模式则是把HSQLDB嵌入应用进程中,这种模式只能存储应用内部数据。该模式的特点是数据库所有信息都存放在内存中,当HSQLDB进程结束时,数据也会随之丢失,因此这种模式只适合做单元测试。我们需要在HSQLDB进程启动后,额外执行建表语句和数据初始化语句。
由于HSQLDB能够很好地支持JDBC规范,因此可以使用它作为Java语言与关系型数据库交互的测试工具。
下面以一个案例介绍HSQLDB内存模式的使用:
代码清单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目录下。
代码清单3:pom.xml
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.15</version>
</dependency>
mybatis中已经包含了hsqldb的依赖。
代码清单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(); } } }
{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章到此就梳理完毕了,本章的主题是:搭建MyBatis源码环境。
回顾一下本章的梳理的内容:
(一)MyBatis3的介绍、搭建源码环境、测试数据库HSQLDB
更多内容请查阅分类专栏:MyBatis3源码深度解析
第2章主要梳理:JDBC规范讲解。主要内容包括:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。