Java H2 教程展示了如何使用 Java 在 H2 中进行数据库编程。
H2 是用 Java 编写的关系数据库管理系统。 它可以嵌入 Java 应用中或以客户端-服务器模式运行。 也可以在存储模式下使用。
H2 的占地面积很小。 它带有一个称为 H2 Console 的基于浏览器的管理应用。
下载 H2
从 H2 的主页,我们以 ZIP 文件下载数据库。
$ unzip h2-2019-03-13.zip
我们解压缩档案。
$ mv h2 ~/bin/
我们将安装目录移动到我们选择的目标位置。
Java H2 内存示例
在第一个示例中,我们连接到内存中的 H2 数据库。 在此示例中,无需运行 H2 服务器。
com/zetcode/JavaSeH2Memory.java
package com.zetcode;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class JavaSeH2Memory {
public static void main(String[] args) {
var url = "jdbc:h2:mem:";
try (var con = DriverManager.getConnection(url);
var stm = con.createStatement();
var rs = stm.executeQuery("SELECT 1+1")) {
if (rs.next()) {
System.out.println(rs.getInt(1));
}
} catch (SQLException ex) {
var lgr = Logger.getLogger(JavaSeH2Memory.class.getName());
lgr.log(Level.SEVERE, ex.getMessage(), ex);
}
}
}
该示例连接到 H2 内存数据库并执行查询。 创建仅用于一个连接的内存专用数据库。 与数据库的连接关闭时,数据库关闭。
var url = "jdbc:h2:mem:";
该 URL 用于内存模式下的 H2 数据库。
建立数据库
在旧版本的 H2 中,如果数据库不存在,则会自动创建一个数据库。 由于安全原因,这不再可行。 在连接数据库之前,我们需要创建一个数据库。
$ java -cp bin/h2-1.4.199.jar org.h2.tools.Shell
Welcome to H2 Shell 1.4.199 (2019-03-13)
Exit with Ctrl+C
[Enter] jdbc:h2:mem:testdb
URL jdbc:h2:~/tmp/h2dbs/testdb
[Enter] org.h2.Driver
Driver
[Enter] sa
User
Password
可以使用 shell 工具创建一个名为testdb
的新数据库。
启动 H2 服务器
现在我们将启动 H2 服务器。
$ java -jar bin/h2-1.4.199.jar -baseDir ~/tmp/h2dbs
Web Console server running at http://127.0.1.1:8082 (only local connections)
TCP server running at tcp://127.0.1.1:9092 (only local connections)
PG server running at pg://127.0.1.1:5435 (only local connections)
我们移至安装目录并在服务器模式下运行 H2。 该命令启动 Web 控制台应用和两个本地连接。 PG 服务器是具有 PostgreSQL 协议的 PostgreSQL 兼容模式。 生成数据库文件的目录设置为~/tmp/h2dbs
,其中〜表示主目录。
我们转到 Web 控制台,并使用jdbc:h2:~/tmp/h2dbs/testdb
URL 连接到testdb
数据库。 该数据库在~/tmp/h2dbs
目录中生成。 默认用户为sa
,未设置密码。
ALTER USER sa SET PASSWORD 's$cret'
在控制台中,我们使用ALTER USER
语句为用户sa
设置密码。
cars_h2.sql
CREATE TABLE cars(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), price INT);
INSERT INTO cars(name, price) VALUES('Audi', 52642);
INSERT INTO cars(name, price) VALUES('Mercedes', 57127);
INSERT INTO cars(name, price) VALUES('Skoda', 9000);
INSERT INTO cars(name, price) VALUES('Volvo', 29000);
INSERT INTO cars(name, price) VALUES('Bentley', 350000);
INSERT INTO cars(name, price) VALUES('Citroen', 21000);
INSERT INTO cars(name, price) VALUES('Hummer', 41400);
INSERT INTO cars(name, price) VALUES('Volkswagen', 21600);
这是创建cars
表的 SQL。 我们在一个示例中使用此表。
H2 Maven 依赖
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
</dependencies>
这是 H2 的 Maven 依赖关系。
Java H2 服务器示例
对于此示例,我们使用以下命令启动 H2 服务器:
$ java -jar bin/h2-1.4.199.jar -baseDir ~/tmp/h2dbs
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zetcode</groupId>
<artifactId>javaseh2server</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<mainClass>com.zetcode.JavaSeH2Server</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
POM 文件包含 H2 数据库引擎和用于使用 Maven 执行 Java 类的exec-maven-plugin
。
com/zetcode/JavaSeH2Server.java
package com.zetcode;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class JavaSeH2Server {
public static void main(String[] args) {
var url = "jdbc:h2:tcp://localhost:9092/~/tmp/h2dbs/testdb";
var user = "sa";
var passwd = "s$cret";
var query = "SELECT * FROM cars";
try (var con = DriverManager.getConnection(url, user, passwd);
var st = con.createStatement();
var rs = st.executeQuery(query)) {
while (rs.next()) {
System.out.printf("%d %s %d%n", rs.getInt(1),
rs.getString(2), rs.getInt(3));
}
} catch (SQLException ex) {
var lgr = Logger.getLogger(JavaSeH2Server.class.getName());
lgr.log(Level.SEVERE, ex.getMessage(), ex);
}
}
}
该示例连接到 H2 服务器并执行查询。 它返回cars
表中的所有行。
var url = "jdbc:h2:tcp://localhost:9092/~/tmp/h2dbs/testdb";
这是用于连接到 H2 服务器的testdb
数据库的 URL。
$ mvn compile
$ mvn -q exec:java
1 Audi 52642
2 Mercedes 57127
3 Skoda 9000
4 Volvo 29000
5 Bentley 350000
6 Citroen 21000
7 Hummer 41400
8 Volkswagen 21600
我们编译并运行该程序。