Javaでコネクションヘルパーを使ってデータベースに接続する

データベースはApache Derbyで。

開発環境

Derbyのダウンロードページから最新版を取得して展開する。

db-derby-10.2.2.0-bin.zip
    
D:\opt\derby
          \-bin
          \-demo
          \-docs
          \-frameworks
          \-javadoc
          \-lib
          \-test
          CHANGES
          index.html
          KEYS
          LICENSE
          NOTICE
          RELEASE-NOTES.html
    

DerbyのダウンロードページからEclipseのプラグインを取得して展開する。

derby_core_plugin_10.2.2.485682.zip
derby_ui_plugin_1.1.0.zip
    
D:\opt\eclipse
          \-plugins
              \-org.apache.derby.core_10.2.2
              \-org.apache.derby.plugin.doc_1.1.0
              \-org.apache.derby.ui_1.1.0
    

Javaプロジェクトの設定を行う。

Java Project
  Context Menu
    Apache Derby
      Add Apache Derby nature
    
ConnectionHelper (Javaプロジェクト)
    \-src
    \-JRE System Library [j2sdkse6]
    \-Referenced Libraries
        \-derby.jar
        \-derbyclient.jar
        \-derbytools.jar
        \-derbynet.jar
    

設定が終わると新しいメニューが使えるようになる。

Java Project
  Context Menu
    Apache Derby
      Remove Apache Derby nature
      Start Derby Network Server
      Stop Derby Network Server
      ij (Interactive SQL)
      sysinfo (Derby System Information)
    

テーブルの作成

ネットワークサーバーを起動する。

Java Project
  Context Menu
    Apache Derby
      Start Derby Network Server
    
Apache Derby Network Server - 2007-07-19 15:38:40.156 GMT に 10.2.2.0 - (485682) が開始され、ポート 1527 で接続を受け入れる準備ができました。
    

データベースを新規作成して接続する。

Java Project
  Context Menu
    Apache Derby
      ij (Interactive SQL)
    
ij version 10.2
ij> connect 'jdbc:derby://localhost:1527/myDB;create=true;user=me;password=mine';
ij> create table amazon(dp varchar(10), title varchar(100));
0 rows inserted/updated/deleted
ij> insert into amazon (dp, title) values ('B000RG1CUY', 'めぐる恋の季節');
1 row inserted/updated/deleted
ij> select dp, title from amazon;
DP        |TITLE
---------------------------------------------------------------------------------------------------------------
B000RG1CUY|めぐる恋の季節

1 row selected
ij> exit;
    

データベースはJavaプロジェクト配下に作成されている。

ConnectionHelper (Javaプロジェクト)
    \-myDB (プロジェクトには追加されない)
    \-src
    \-JRE System Library [j2sdkse6]
    \-Referenced Libraries
        \-derby.jar
        \-derbyclient.jar
        \-derbytools.jar
        \-derbynet.jar
    

ソースコード

package org.tea4miki.db;

package org.tea4miki.db;

/**
 * データアクセスオブジェクトの例外です。
 */
public class DAOException extends Exception {

    private static final long serialVersionUID = -3836542407268066922L;

    public DAOException() {
        super();
    }

    public DAOException(String message) {
        super(message);
    }

    public DAOException(String message, Throwable cause) {
        super(message, cause);
    }

    public DAOException(Throwable cause) {
        super(cause);
    }
}
    
package org.tea4miki.db;

/**
 * データアクセスオブジェクトの検索の例外です。
 */
public class FindException extends DAOException {

    private static final long serialVersionUID = -1745055245358928454L;

    public FindException() {
        super();
    }

    public FindException(String message) {
        super(message);
    }

    public FindException(String message, Throwable cause) {
        super(message, cause);
    }

    public FindException(Throwable cause) {
        super(cause);
    }
}
    

package org.tea4miki.db.connectionhelper;

package org.tea4miki.db.connectionhelper;

/**
 * Amazonテーブルのレコードです。
 */
public class Amazon {

    private String dp;
    private String title;

    public String getDp() {
        return dp;
    }
    public void setDp(String dp) {
        this.dp = dp;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}
    
package org.tea4miki.db.connectionhelper;

import java.sql.*;
import org.tea4miki.db.*;

/**
 * Amazonテーブル用のデータアクセスオブジェクトです。
 */
public class AmazonDAO {

    /**
     * DPの値でレコードを検索します。
     * 
     * @param dp DPの値
     * @return Amazonテーブルのレコード
     * @throws FindException 見つからない場合
     */
    public Amazon findBy(String dp) throws FindException {
        Connection conn = null;
        PreparedStatement stat = null;
        ResultSet rs = null;

        Amazon amazon = null;
        String sql = null;

        sql = " SELECT   DP"
            + "         ,TITLE"
            + " FROM     AMAZON"
            + " WHERE    DP = ?";

        try {
            conn = ConnectionHelper.getConnection();
            stat = conn.prepareStatement(sql);
            stat.setString(1, dp);

            rs = stat.executeQuery();

            while (rs.next()) {
                amazon = new Amazon();
                amazon.setDp(rs.getString(1));
                amazon.setTitle(rs.getString(2));
            }

            if (amazon == null) {
                throw new FindException("指定されたDPの値のレコードが見つかりません。DP[" + dp + "]");
            }
        }
        catch (SQLException e) {
            throw new RuntimeException(e);
        }
        finally {
            ConnectionHelper.closeConnection(conn, stat, rs);
        }

        return amazon;
    }
}
    
package org.tea4miki.db.connectionhelper;

import java.net.*;
import org.tea4miki.db.*;

/**
 * クライアントへのインターフェースです。
 */
public class Assembler {

    /**
     * 指定されたDPの値でAmazonのURLを構築します。
     * 
     * @param dp DPの値
     * @return AmazonのURL。DPの値が見つからない場合は長さ0の文字列
     */
    public String getAmazonURL(String dp) {
        String url = null;

        try {
            AmazonDAO dao = new AmazonDAO();
            Amazon amazon = null;
            URI uri = null;

            amazon = dao.findBy(dp);
            uri = new URI("http://www.amazon.co.jp/" + amazon.getTitle() + "/dp/" + amazon.getDp());
            url = uri.toASCIIString();
        }
        catch (FindException e) {
            url = "";
        }
        catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }

        return url;
    }
}
    
package org.tea4miki.db.connectionhelper;

import java.sql.*;

/**
 * コネクションヘルパーです。
 */
public class ConnectionHelper {

    /**
     * 新しいコネクションヘルパーを構築します。
     * 
     * データベースURLは"jdbc:subprotocol:subname"形式で指定します。
     * subprotocol: 使用するドライバ
     * subname    : 接続するのに必要な情報
     * 
     * jdbc:derby://localhost:1527/myDB;user=me;password=mine;
     * derby-JDBCドライバを使用してlocalhostのポート1527で動作しているサーバー上の
     * "myDB"というデータベースにユーザー"me"、パスワード"mine"で接続することを示しています。
     */
    private ConnectionHelper() {
        try {
            Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
            setUrl("jdbc:derby://localhost:1527/myDB;user=me;password=mine;");
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * データベースへの接続を取得します。
     * 
     * @return データベースへの接続
     */
    public static Connection getConnection() {
        try {
            return DriverManager.getConnection(getInstance().getUrl());
        }
        catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * データベースへの接続を閉じます。
     * 
     * @param conn データベースへの接続
     */
    public static void closeConnection(Connection conn) {
        closeConnection(conn, null, null);
    }

    /**
     * データベースへの接続を閉じます。
     * 
     * @param conn データベースへの接続
     * @param stat ステートメント
     */
    public static void closeConnection(Connection conn, Statement stat) {
        closeConnection(conn, stat, null);
    }

    /**
     * データベースへの接続を閉じます。
     * 
     * @param conn データベースへの接続
     * @param stat ステートメント
     * @param rs   結果セット
     */
    public static void closeConnection(Connection conn, Statement stat, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            }
            catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

        if (stat != null) {
            try {
                stat.close();
            }
            catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

        if (conn != null) {
            try {
                conn.close();
            }
            catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

    /**
     * コネクションヘルパーのインスタンスを取得します。
     * 
     * @return コネクションヘルパーのインスタンス
     */
    private static ConnectionHelper getInstance() {
        if (helper == null) {
            helper = new ConnectionHelper();
        }

        return helper;
    }

    /**
     * データベースURLを取得します。
     * 
     * @return データベースURL
     */
    private String getUrl() {
        return url;
    }

    /**
     * データベースURLを設定します。
     * 
     * @param url データベースURL
     */
    private void setUrl(String url) {
        ConnectionHelper.url = url;
    }

    /** コネクションヘルパーのインスタンス */
    private static ConnectionHelper helper;
    /** データベースURL */
    private static String url;
}
    

package org.tea4miki.db.test;

package org.tea4miki.db.test;

import junit.framework.*;
import org.tea4miki.db.connectionhelper.*;

public class ConnectionHelperAssemblerTest extends TestCase {

    public void testGetAmazonURL() {
        Assembler assembler = new Assembler();
        System.out.println(assembler.getAmazonURL("B000RG1CUY"));
    }
}
    

実行結果

http://www.amazon.co.jp/%E3%82%81%E3%81%90%E3%82%8B%E6%81%8B%E3%81%AE%E5%AD%A3%E7%AF%80/dp/B000RG1CUY
    

関連情報

2007, AfternoonTea