H2 Database

是什么

H2 Java SQL数据库。

H2的主要特点是:

  • 非常快速的开源JDBC API

  • 嵌入式和服务器模式; 内存数据库

  • 基于浏览器的控制台应用程序

  • 占用空间小:大约1.5 MB的jar文件大小

特性对比

H2 Derby HSQLDB MySQL PostgreSQL
Pure Java Yes Yes Yes No No
Memory Mode Yes Yes Yes No No
Encrypted Database Yes Yes Yes No No
ODBC Driver Yes No No Yes Yes
Fulltext Search Yes No No Yes Yes
Multi Version Concurrency Yes No Yes Yes Yes
Footprint (jar/dll size) ~1 MB ~2 MB ~1 MB ~4 MB ~6 MB

作用

(1)可以和 DBUnit 这种数据测试框架结合使用。

(2)对于比较轻量的数据库处理,可以使用 h2 替代 mysql,后期替换的代价也不大。

(3)便于数据库原理的学习。因为是纯 java 实现的。

Hello World

  • 引入 jar
<dependencies>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.196</version>
    </dependency>
</dependencies>
  • 入门测试
import org.h2.tools.Server;

import java.sql.*;

/**
 * H2 入门测试案例
 * @author bbhou
 */
public class HelloH2 {

    private Server server;

    private static final String URL = "jdbc:h2:mem:h2db";
    private static final String PORT = "8082";
    private static final String USERNAME = "sa";
    private static final String PASSWORD = "123456";

    /**
     * 启动服务
     */
    public void startServer() {
        try {
            System.out.println("正在启动h2...");
            server = Server.createTcpServer(
                    new String[] { "-tcpPort", PORT}).start();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 停止服务
     */
    public void stopServer() {
        if (server != null) {
            System.out.println("正在关闭h2...");
            server.stop();
            System.out.println("关闭成功.");
        }
    }

    /**
     * 简单测试
     */
    public void testH2() {
        // 加载驱动
        try {
            Class.forName("org.h2.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        try(Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            Statement statement = connection.createStatement()){

            // 插入数据
            statement.execute("CREATE MEMORY Table test(NAME VARCHAR)");
            statement.execute("INSERT INTO test VALUES('Hello H2DB!')");

            // 查询数据
            try(ResultSet result = statement.executeQuery("SELECT NAME FROM test")) {
                while (result.next()) {
                    System.out.println(result.getString("name"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        HelloH2 h2 = new HelloH2();

        // 开始服务
        h2.startServer();
        h2.testH2();
        // 关闭服务
        h2.stopServer();
    }
}
  • 测试结果
正在启动h2...
Hello H2DB!
正在关闭h2...
关闭成功.

小结

h2 databse 非常的轻量小巧,值得学习一波。

为后续自己手写一个简易版 h2 做准备。