2016-12-05

Java DB を試す

Apache Derby は、IBM から寄贈された Cloudscape のソースコードを元に、Apache ソフトウェア財団によってプログラムの開発が進められている、Java 技術で実装された RDBMS のソフトウェアです。Java DB は、オープンソースの Apache Derby データベースをオラクルがサポートしたディストリビューションです。JDBC API および Java EE API により標準の ANSI/ISO SQLをサポートします。Java DBは、JDKに含まれています。

以前、Python で SQLite3 のデータベースを操作するサンプルを紹介しましたが [1]、Java と Python を状況に応じて使い分けており、アプリケーション専用で使用するような簡単なデータベースが利用できると、どちらの場合も便利です。Java の開発環境である JDK では、Java DB が利用できるので、わざわざ SQLite を使わなくとも、ひとまず、Java DB を使ってみることにしました。

動作環境は次の通りです。Linux (Fedora) ですが、標準パッケージの OpenJDK は使用していません。

  • OS: Fedora 25 (x86_64)
  • Java: jdk1.8.0_112-1.8.0_112-fcs.x86_64 (Oracle)
  • IDE: NetBeans IDE 8.2

ライブラリの追加

Java DB を使うためには、Java DB 用の JDBC ドライバーの入っているライブラリーが必要になります。組込用途には derby.jar を、クライアント/サーバー環境用には derbyclient.jar をクラスパスに追加します。

今回は、組込用途として derby.jar を下記のように NetBeans のプロジェクトに追加しました。

サンプルソース

今回も DBOnlineSQLite入門 › データの追加と削除 › データの更新 [2] で使われている例をベースに焼き直しています。あらかじめご了承ください。

リスト:JavaDBTest.java 
package javadbtest;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public final class JavaDBTest {

    Connection conn;

    JavaDBTest(String dbFile) {
        connection(dbFile);
    }

    // database connection
    void connection(String dbFile) {
        try {
            conn = DriverManager.getConnection("jdbc:derby:" + dbFile + "; create=true");
        } catch (SQLException ex) {
            Logger.getLogger(JavaDBTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    // Executes the given SQL statement that returns nothing
    void executeSQL(String sql) {
        Statement stat;
        try {
            stat = conn.createStatement();
            stat.executeUpdate(sql);
        } catch (SQLException ex) {
            Logger.getLogger(JavaDBTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    // Executes the given SQL statement, which returns a single ResultSet object.
    ResultSet querySQL(String sql) {
        Statement stat;

        try {
            stat = conn.createStatement();
            return stat.executeQuery(sql);
        } catch (SQLException ex) {
            Logger.getLogger(JavaDBTest.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // database termination
    void shutdown(String dbFile) {
        try {
            conn.close();
            DriverManager.getConnection("jdbc:derby:" + dbFile + "; shutdown=true");
        } catch (SQLException ex) {
            Logger.getLogger(JavaDBTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void main(String[] args) {
        String dbName = "test01";
        String dbDir = new File(System.getenv("HOME"), "tmp").getPath();
        String dbFile = new File(dbDir, dbName).getPath();

        JavaDBTest db = new JavaDBTest(dbFile);

        // create table
        db.executeSQL("create table staff(id integer, name varchar(10), unit varchar(10), flag varchar(4))");
        db.executeSQL("insert into staff(id, name, unit, flag) values (1, 'Satoh', 'Sales', 'Yes')");
        db.executeSQL("insert into staff(id, name, unit, flag) values (2, 'Mori', 'Office', 'No')");
        db.executeSQL("insert into staff(id, name, unit, flag) values (3, 'Yamada', 'Office', 'Yes')");
        db.executeSQL("insert into staff(id, name, unit, flag) values (4, 'Asada', 'Tech', 'Yes')");
        db.executeSQL("insert into staff(id, name, unit, flag) values (5, 'Noguchi', 'Sales', 'No')");

        // query
        ResultSet res = db.querySQL("select * from staff");
        try {
            while (res.next()) {
                System.out.println(res.getInt("id") + "\t" + res.getString("name")
                        + "\t" + res.getString("unit") + "\t" + res.getString("flag"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(JavaDBTest.class.getName()).log(Level.SEVERE, null, ex);
        }

        // database termination
        db.shutdown(dbFile);
    }
}

実行例

CPU (N2830) が非力だからでしょうか、妙に時間がかかっています。

run:
1 Satoh Sales Yes
2 Mori Office No
3 Yamada Office Yes
4 Asada Tech Yes
5 Noguchi Sales No
ビルド成功(合計時間: 12秒)

参考サイト

  1. bitWalk's: Python と SQLite3
  2. データの更新(UPDATE文) - SQLite入門
  3. JavaDBメモ(Hishidama's JavaDB Memo)
  4. Windows上でjavaDBをとりあえず使ってみる

 

ブログランキング・にほんブログ村へ
にほんブログ村

0 件のコメント: