概述
→点击这里,进入 H2 官网链接
H2 数据库是一个 Java 开发的嵌入式数据库,它本身就是一个 jar 包,可以直接嵌入到应用项目中。
官网给出了主要特点有:
▷ 速度快
▷ 开源
▷ 支持 JDBC API
▷ 拥有嵌入式模式和服务器模式
▷ 内存存储的数据库
▷ 拥有基于浏览器的控制台应用程序
▷ 占用空间小:大概 2MB 左右的 jar 包文件
下载安装
1. 下载
H2 下载地址:https://h2database.com/html/download.html
进入到下载页面,最顶端为最新版本的下载链接,分为 Windows 系统和其他系统,其他系统为 zip 包。我的是 Mac 系统,下载了 zip 包来用。
2. 安装
下载完成后直接用 unzip
命令解压即可。解压后的目录如下图
目录 | 内容 |
---|---|
bin | jar 包和批处理文件 |
docs | 文档 |
docs/html | html 页 |
docs/javadoc | java 文档 |
service | 将数据库作为 Windows 服务运行的工具 |
src | 源码文件 |
src/docsrc | 源码文档 |
src/installer | installer,shell 和 release build 脚本 |
src/main | 数据库引擎源码 |
src/test | 测试源码 |
src/tools | 工具和数据库适配器源代码 |
3. 启动
到 bin
目录下直接运行 jave -jar h2*.jar
即可
4. 测试
1.进入到 http://localhost:8082 页面,浏览器控制台支持中文,我这里选择了中文。H2 数据库有两种模式,内嵌式(Embedded)和服务器式(Server)。
内嵌式有两种模式,一种数据是非持久化的,数据只支持在当前窗口进行操作,操作完成退出窗口后,所有数据不作改变,一般测试环境使用,URL 为 jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-1
;另一种是持久化的,数据会落地到指定目录,比如 URL 可以写成 jdbc:h2:./test
。
服务器式的 URL 是指定一个 TCP 的远程目录,比如 jdbc:h2:tcp://localhost/~/test
。
2.点击框选区域,可以生成样例 SQL 模板,可以直接点击执行按钮执行,也可以使用 Ctrl + Enter
执行,Shift + Enter
可以执行选中的 SQL 语句。
3.执行完成后,左侧为当前表格的目录,下方为运行结果。
JDBC 实践
1. 导包
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
2. 代码
import com.oracle.tools.packager.Log;
import java.sql.*;
import java.util.logging.Logger;
/** FileName: H2Client Author: zhaozhuang Date: 2021/1/26 上午11:01 Description: */
public class H2Client {
// 内嵌非持久化模式
private static final String embeddedTmpUrl = "jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-1";
// 内线持久化模式
private static final String embeddedPersistentUrl = "jdbc:h2:./test";
// 服务式模式
private static final String serverUrl = "jdbc:h2:tcp://localhost/~/test";
// 用户名
private static final String user = "sa";
// 密码(h2 数据库默认为空)
private static final String password = "";
// 驱动类
private static final String driverClass = "org.h2.Driver";
private static Connection connection;
private static Statement statement;
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// 获取 H2 数据库的连接池
getConnection();
drop();
create();
insert();
select();
update();
delete();
close();
}
/**
* 获取 H2 数据库的连接池
*
* @throws SQLException
*/
public static void getConnection() throws SQLException, ClassNotFoundException {
connection = DriverManager.getConnection(embeddedTmpUrl, user, password);
}
/**
* 删除表
*
* @throws SQLException
*/
public static void drop() throws SQLException {
// 删除表
String drop = "DROP TABLE IF EXISTS TEST";
statement = connection.createStatement();
statement.execute(drop);
}
/**
* 创建表
*
* @throws SQLException
*/
public static void create() throws SQLException {
// 创建表
String create = "CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))";
statement = connection.createStatement();
statement.execute(create);
}
/**
* 插入数据
*
* @throws SQLException
*/
public static void insert() throws SQLException {
// 插入数据
String insertHello = "INSERT INTO TEST VALUES(1, 'Hello')";
String insertWorld = "INSERT INTO TEST VALUES(2, 'World')";
statement = connection.createStatement();
statement.execute(insertHello);
statement.execute(insertWorld);
}
/**
* 查询数据
*
* @throws SQLException
*/
public static void select() throws SQLException {
// 查询数据
String select = "SELECT * FROM TEST ORDER BY ID";
PreparedStatement ps = connection.prepareStatement(select);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.printf("id: [%s], name: [%s]\n", id, name);
}
}
/**
* 更新数据
*
* @throws SQLException
*/
public static void update() throws SQLException {
// 更新数据
String update = "UPDATE TEST SET NAME='Hi' WHERE ID=1";
statement = connection.createStatement();
int i = statement.executeUpdate(update);
System.out.printf("Updated data counts: [%s]\n",i);
}
/**
* 删除数据
* @throws SQLException
*/
public static void delete() throws SQLException {
// 删除数据
String delete = "DELETE FROM TEST WHERE ID=2";
statement = connection.createStatement();
int i = statement.executeUpdate(delete);
System.out.printf("Deleted data counts: [%s]\n",i);
}
public static void close() throws SQLException {
if (statement != null){
statement.close();
}
if (connection != null){
connection.close();
}
}
}
控制台:
0
id: [1], name: [Hello]
id: [2], name: [World]
Updated data counts: [1]Deleted data counts: [1]
Process finished with exit code 0