広告

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
                      2011年01月25日

    Java総合講座 - 初心者から達人へのパスポート
                  2009年11月開講コース 037号

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■


-------------------------------------------------------
・現在、このメールマガジンは以下の2部構成になっています。
[1] 当初からのコース:vol.xxx(xxxは番号)が振られています。
   これは現在、中級レベルになっています。
[2] 2009年11月開講コース:xxx号(xxxは番号)が振られています。
   これは現在、初心者向けのレベルになっています。
・このメールマガジンは、画面を最大化して見てください。
小さな画面で見ていると、不適切な位置で行が切れてしまう
など、問題を起すことがあります。
・このメールマガジンに掲載されているソース・コード及び
文章は特に断らない限り、すべて筆者が著作権を所有してい
ます。また、これらのソース・コードは学習用のためだけに
提供しているものです。
-------------------------------------------------------


========================================================
◆ 01.データベースを使用するアプリケーションの開発(続き)
========================================================

今回は、先週の続きとして、まずコーディングの例を提示して
いくことにします。
なお、ソース・コードの解説は次回にまわします。

余力のある人は、下記のコーディングの例をすべてEclipseに
入力して、動作を確認してみてください。
Eclipseへの具体的な入力方法についても次回説明いたします。


では、まずComboBoxModelOfDepartmentのコーディング例を提示
します。
--------------------------------------------------------
package jp.co.flsi.lecture.ui.model;

import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import java.util.Vector;
import jp.co.flsi.lecture.entity.Department;

public class ComboBoxModelOfDepartment extends AbstractListModel implements
ComboBoxModel {
   private Vector departmentList;
   private String selection;

   public void setDepartmentList(Vector aDepartmentList) {
      departmentList = aDepartmentList;
   }

   public Vector getDepartmentList() {
      return departmentList;
   }

   public Object getSelectedItem() {
      return selection;
   }

   public void setSelectedItem(Object anItem) {
      selection = (String)anItem;
   }

   public Object getElementAt(int index) {
      return ((Department) getDepartmentList().elementAt(index)).getDepartmentName();
   }

   public int getSize() {
      return getDepartmentList().size();
   }

}
--------------------------------------------------------

このソース・コードの中に出てくるDepartmentというのは、部門
を表現するクラス(現実世界のオブジェクトをモデル化したもの)
です。

そのDepartmentクラスのソース・コードの例は以下の通りです。
--------------------------------------------------------
package jp.co.flsi.lecture.entity;

public class Department {
   private int departmentNumber;
   private String departmentName;
   private String location;

   public void setDepartmentNumber(int departmentNumber) {
      this.departmentNumber = departmentNumber;
   }
  
   public int getDepartmentNumber() {
      return departmentNumber;
   }
  
   public void setDepartmentName(String departmentName) {
      this.departmentName = departmentName;
   }
  
   public String getDepartmentName() {
      return departmentName;
   }
  
   public void setLocation(String location) {
      this.location = location;
   }
  
   public String getLocation() {
      return location;
   }

}
--------------------------------------------------------

それから、データベース処理専用のオブジェクトのクラスを以下
のようにコーディングしてみます。

まず、個々のテーブルに依存しない基本的な処理だけを行うクラス
をDbManagerというクラス名で作成することにします。
下記がそのコーディング例です。
--------------------------------------------------------
package jp.co.flsi.lecture.db;

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

public class DbManager {
   protected static Connection conn = null;
   protected String driver = "org.h2.Driver";
   protected String url = "jdbc:h2:tcp://localhost/~/test";
   protected String dbUser = "sa";
   protected String dbPassword = "";

   protected void connect() throws java.sql.SQLException {
      try {
         if(conn == null || conn.isClosed()) {
            Class.forName(driver);
            conn = DriverManager.getConnection
                        (url, dbUser, dbPassword);
            conn.setAutoCommit(false);
         }
      } catch(ClassNotFoundException ex) {
         ex.printStackTrace();
      }
   }

   protected void disconnect() {
      try {
         conn.close();
      } catch(SQLException ex) {
         ex.printStackTrace();
      }
   }

}
--------------------------------------------------------

次にDbManagerのサブクラスとして、個々のテーブルを処理する
クラスを用意することにしますが、今回はDEPARTMENTテーブルを
処理するためのクラスとしてDepartmentDbManagerというクラスを
作成することにします。
下記がそのコーディング例です。
--------------------------------------------------------
package jp.co.flsi.lecture.db;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import jp.co.flsi.lecture.entity.Department;

public class DepartmentDbManager extends DbManager {
   private Vector departmentList = new Vector();

   public Vector getDepartmentList() {
      return departmentList;
   }

   public void getAllData() {
      try {
        connect();
        Statement selectSql = conn.createStatement();
        ResultSet rs = selectSql.executeQuery("SELECT * FROM DEPARTMENT");
        while (rs.next()) {
            Department aDepartment = new Department();
            aDepartment.setDepartmentNumber(rs.getInt("DEPART_NUM"));
            aDepartment.setDepartmentName(rs.getString("DEPART_NAME"));
            aDepartment.setLocation(rs.getString("LOCATION"));
            getDepartmentList().addElement(aDepartment);
        }
        selectSql.close();
        disconnect();
      }
      catch (SQLException exception) {
        exception.printStackTrace();
      }
   }

}
--------------------------------------------------------

なお、Javaのプログラムでデータベース処理を行う(RDBMSを呼び出す)
ためには、JDBCドライバーをJavaのクラスパス(CLASSPATH)に登録して
おく必要がありますが、Eclipseの場合は下記(補足)のような作業を行っ
ておきます。(022号で実施済みの人は読むだけにして下さい。)

┌補足─────────────────────────┐
EclipseでH2 Database EngineのJDBCドライバーをクラスパスに追加す
るには下記の[方法1]または[方法2]のいずれかを行います。

[方法1]
(1) 「パッケージ・エクスプローラー」の中のJStudy1(プロジェクト名)
を右クリックし 「プロパティー」を選択する。

(2) 「プロパティー」ウインドウの左側で「Javaのビルド・パス」を
クリックし、右側の「ライブラリー」タブをクリックする。

(3) 右側の「外部JARの追加」ボタンをクリックする。

(4) 「JARの選択」ウインドウで適切なJARファイルを選択する。
H2 Database EngineのJDBCドライバーの場合は標準のインストールでは、
C:のProgram Filesフォルダーの中のH2フォルダーの中のbinフォルダー
の中にh2-1.2.132.jarというファイル名で入っているので、これを選択し、
「開く」ボタンをクリックする。
(JARファイルとは何か、という話については後述)

(5) 「プロパティー」ウインドウの「OK」ボタンをクリックする。


[方法2]
(1) 「ウィンドウ」メニュー → 「設定」を選択する。

(2) 「設定」ウインドウの左側で「Java」の中の「ビルド・パス」の中の
「ユーザー・ライブラリー」をクリックする。

(3) 右側の「新規」ボタンをクリックする。

(4) ライブラリー名を例えば「h2database」と入力して「OK」ボタンを
クリックする。

(5) 「h2database」を選択し、「JARの追加」ボタンをクリックする。

(6) 「JARの選択」ウインドウで適切なJARファイルを選択する。
H2 Database EngineのJDBCドライバーの場合は標準のインストールでは、
C:のProgram Filesフォルダーの中のH2フォルダーの中のbinフォルダー
の中にh2-1.2.132.jarというファイル名で入っているので、これを選択し、
「開く」ボタンをクリックする。
(JARファイルとは何か、という話については後述)

(7) 「設定」ウインドウの「OK」ボタンをクリックする。

(8) 「パッケージ・エクスプローラー」の中のJStudy1(プロジェクト名)
を右クリックし「プロパティー」を選択する。

(9) 「プロパティー」ウインドウの左側で「Javaのビルド・パス」を
クリックし、右側の「ライブラリー」タブをクリックする。

(10) 右側の「ライブラリーの追加」ボタンをクリックする。

(11) 「ライブラリーの追加」ウインドウの中の「ユーザー・ライブラリー」
を選択し、「次へ」ボタンをクリックする。

(12) 「h2database」(これは先ほど作成したライブラリー名)の左側に
チェック・マークを入れ(クリックすればチェック・マークが入る)、
「完了」ボタンをクリックする。

(13) 「プロパティー」ウインドウの「OK」ボタンをクリックする。


上記の[方法1]と[方法2]を比較すると[方法1]のほうが簡単に見えますが、
のちにさまざまなプロジェクトで同じJDBCドライバーを使用することま
で考えると、[方法2]を使ったほうが後々の作業が楽になります。
└───────────────────────────┘


なお、これらのクラスを作っただけでは、JComboBoxには何も表示され
ませんね。
まだJComboBoxとの関連付けがされていないのですから、あたりまえです。

そこで、HumanResourceEntryPaneのソース・コードの中の以下の部分
--------------------------------------------------------
   private JComboBox getComboBox_1() {
      if (comboBox_1 == null) {
         comboBox_1 = new JComboBox();
      }
      return comboBox_1;
   }
--------------------------------------------------------

を次のように編集しておくことにします。
--------------------------------------------------------
   private JComboBox getComboBox_1() {
      if (comboBox_1 == null) {
            DepartmentDbManager aDbm = new DepartmentDbManager();
            aDbm.getAllData();
            ComboBoxModelOfDepartment model = new ComboBoxModelOfDepartment();
            model.setDepartmentList(aDbm.getDepartmentList());
            comboBox_1 = new JComboBox(model);
            comboBox_1.setSelectedIndex(0);
      }
      return comboBox_1;
   }
--------------------------------------------------------

これでデータベースのDEPARTMENTテーブルから取り出した部門名のリスト
をJComboBoxに表示するための仕組みが一通りできたはずです。

(これらのソース・コードの入力は後の記事で行います。)


(続く・・・)



================================================
◆ 02.演習問題
================================================

ここまでのところをEclipseに自力で入力できる人は、独力で入力して
HumanResourceJFrameを実行し、動作を確認してみてください。

なお、プログラムの実行前にRDBMSを起動しておかなければデータ
ベースが使用できませんから、あらかじめH2 Consoleを立ち上げる
などしてH2 Database EngineのRDBMSを起動しておいてください。



では、また来週。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2011 Future Lifestyle Inc. 不許無断複製