top / index / prev / next / target / source

2017-09-29 diary: [Java] h2 を使ったインメモリ DB のシンプルサンプル

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

[Java] h2 を使ったインメモリ DB のシンプルサンプル

Java 言語を使って ちょっと複雑なデータ処理をおこないたいときには、インメモリ DB を使って実装すると快適です。 ここでは Java プログラマーの間で人気の h2 データベースを使ったインメモリ DB 利用を Maven ベースで簡単にメモします。

まず、h2 JDBC Driver を Java プロジェクトに追加します。Mavenpom.xml に以下の記述を追加します。

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

次に、Java のコードが続きます。JDBC API を使って以下のように記述すると、柔軟なデータ処理が実現できます。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SimpleDbSample {
    static {
        System.err.println("Loading h2 JDBC Driver");
        try {
            Class.forName("org.h2.Driver");
        } catch (ClassNotFoundException ex) {
            throw new IllegalArgumentException("Fail to load h2 driver: " + ex.getMessage(), ex);
        }
    }

    public static void main(final String[] args) throws SQLException {
        System.err.println("Connect to inmemory db.");
        try (Connection conn = DriverManager.getConnection("jdbc:h2:mem:sfdcjdbc")) {
            new SimpleDbSample().process(conn);
        }
    }

    public void process(final Connection conn) throws SQLException {
        try (PreparedStatement stmt = conn.prepareStatement(
                "CREATE TABLE MY_WORK_TBL (ENTRY_NAME VARCHAR_IGNORECASE NOT NULL, ENTRY_COUNT INTEGER)")) {
            stmt.executeUpdate();
        }

        System.err.println("Preparing data.");
        try (PreparedStatement stmt = conn
                .prepareStatement("INSERT INTO MY_WORK_TBL (ENTRY_NAME, ENTRY_COUNT) VALUES (?, ?)")) {
            for (int index = 0; index < 10; index++) {
                stmt.setString(1, "ENTRY" + index);
                stmt.setInt(2, index);
                stmt.executeUpdate();
            }
        }

        System.err.println("Searching data.");
        try (PreparedStatement stmt = conn
                .prepareStatement("SELECT ENTRY_NAME, ENTRY_COUNT FROM MY_WORK_TBL ORDER BY ENTRY_COUNT DESC")) {
            try (final ResultSet rs = stmt.executeQuery()) {
                for (; rs.next();) {
                    System.err.println(rs.getString(1) + ":" + rs.getInt(2));
                }
            }
        }
    }
}

Java コード内で RDBMS 処理を気軽に実行でるため、これは便利です。

Last modified: $Date: 2017-09-29 $

登場キーワード


この日記について