ZetCode

Java H2

最后修改于 2024 年 1 月 27 日

Java H2 教程展示了如何在 Java 中进行 H2 数据库编程。

H2 是一个用 Java 编写的关系数据库管理系统。它可以嵌入到 Java 应用程序中,也可以在客户端-服务器模式下运行。它也可以在内存模式下使用。

H2 的体积非常小。它带有一个基于浏览器的管理应用程序,称为 H2 Console。

下载 H2

从 H2 的主页,我们下载 ZIP 文件中的数据库。

$ unzip h2-2022-06-13.zip

我们解压缩该存档。

Java H2 内存示例

在第一个示例中,我们连接到内存中的 H2 数据库。 此示例不需要运行 H2 服务器。

bin
com
└── zetcode
    └── SimpleEx.java
lib
└── h2-2.1.214.jar

这是我们的项目结构。

com/zetcode/SimpleEx.java
package com.zetcode;

import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SimpleEx {

    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(SimpleEx.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
}

该示例连接到一个 H2 内存数据库并执行一个查询。 创建了一个仅供一个连接使用的内存私有数据库。 当与数据库的连接关闭时,该数据库也被关闭。

var url = "jdbc:h2:mem:";

此 URL 用于 H2 数据库的内存模式。

$ javac com/zetcode/SimpleEx.java -d bin

我们编译程序。

$ java -cp bin:lib/* com.zetcode.SimpleEx
2

我们运行该程序。

创建数据库

在旧版本的 H2 中,如果数据库不存在,会自动创建。 由于安全原因,这不再可能。 我们需要在连接到数据库之前创建数据库。

$ java -cp lib/h2-2.1.214.jar org.h2.tools.Shel

Welcome to H2 Shell 2.1.214 (2022-06-13)
Exit with Ctrl+C
[Enter]   jdbc:h2:~/test
URL       jdbc:h2:~/tmp/h2dbs/testdb
[Enter]   org.h2.Driver
Driver
[Enter]   sa
User
Password

可以使用 shell 工具创建一个名为 testdb 的新数据库。

启动 H2 服务器

现在我们将启动 H2 服务器。

$ java -jar lib/h2-2.1.214.jar -baseDir ~/tmp/h2dbs

我们移动到安装目录并在服务器模式下运行 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。 我们在一个示例中使用此表。

Java H2 服务器示例

在下一个示例中,我们从之前创建的 cars 表中选择数据。

$ java -jar lib/h2-2.1.214.jar -baseDir ~/tmp/h2dbs

对于此示例,我们使用以下命令启动 H2 服务器

com/zetcode/SimpleEx.java
package com.zetcode;

import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SimpleEx {

    public static void main(String[] args) {

        var url = "jdbc:h2:tcp://: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(SimpleEx.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
}

该示例连接到 H2 服务器并执行查询。 它返回 cars 表中的所有行。

var url = "jdbc:h2:tcp://:9092/~/tmp/h2dbs/testdb";

这是连接到 H2 服务器的 testdb 数据库的 URL。

$ javac com/zetcode/SimpleEx.java -d bin
$ java -cp bin:lib/* com.zetcode.SimpleEx 
1 Audi 52642
2 Mercedes 57127
3 Skoda 9000
4 Volvo 29000
5 Bentley 350000
6 Citroen 21000
7 Hummer 41400
8 Volkswagen 21600

我们编译并运行程序。

来源

H2 数据库教程

Java H2 教程展示了如何在 Java 中编程 H2 数据库。

作者

我叫 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程