# Java H2 教程

原文：http://zetcode.com/java/h2database/

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

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

H2 的占地面积很小。 它带有一个称为 H2 控制台的基于浏览器的管理应用。

## 下载 H2

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

```java
$ unzip h2-2019-03-13.zip

```

我们解压缩档案。

```java
$ mv h2 ~/bin/

```

我们将安装目录移动到我们选择的目标位置。

## Java H2 内存示例

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

`com/zetcode/JavaSeH2Memory.java`

```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 内存数据库并执行查询。 创建仅用于一个连接的内存专用数据库。 与数据库的连接关闭时，数据库关闭。

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

```

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

## 建立数据库

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

```java
$ 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
$ 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`，未设置密码。

```java
ALTER USER sa SET PASSWORD 's$cret'

```

在控制台中，我们使用`ALTER USER`语句为用户`sa`设置密码。

`cars_h2.sql`

```java
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 依赖

```java
<dependencies>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.199</version>
    </dependency>

</dependencies>

```

这是 H2 的 Maven 依赖关系。

## Java H2 服务器示例

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

```java
$ java -jar bin/h2-1.4.199.jar -baseDir ~/tmp/h2dbs

```

`pom.xml`

```java
<?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`

```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`表中的所有行。

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

```

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

```java
$ 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

```

我们编译并运行该程序。

Java H2 教程展示了如何用 Java 编程 H2 数据库。 您可能也对 [Derby 教程](/db/apachederbytutorial)， [MySQL Java 教程](/db/mysqljava/)， [RESTEasy H2 教程](/jaxrs/resteasyh2/)和 [PostgreSQL Java 教程](/db/postgresqljavatutorial/)感兴趣。

列出[所有 Java 教程](/all/#java)。