広告

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
                      2011年12月15日

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

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


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


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

HumanResourceEntryPaneの「更新」のページで「更新」ボタンを
クリックしたら、データベースのEMPLOYEEテーブルの更新を行う
ように、EmployeeDbManagerクラスに機能を追加しましょう。

では、EclipseでEmployeeDbManagerのエディターを開き、以下の
編集を行ってください。

まず、下記のPreparedStatement型の変数

--------------------------------------------------------
private String updateSql = "UPDATE EMPLOYEE SET NAME = ?," +
   " DATE_OF_BIRTH = ?, DEPART_NUM = ? WHERE EMP_NUM = ?";
--------------------------------------------------------

を追加しましょう。

次に、下記のメソッドを追加しましょう。

--------------------------------------------------------
public boolean updateData(Employee anEmployee) {
   try {
      connect();
      PreparedStatement selectPs = conn.prepareStatement(selectSql);
      selectPs.setInt(1, anEmployee.getEmployeeNumber());
      ResultSet rs = selectPs.executeQuery();
      if (!rs.next()) return false;
      selectPs.close();
      conn.setAutoCommit(false);
      PreparedStatement updatePs = conn.prepareStatement(updateSql);
      updatePs.setString(1, anEmployee.getName());
      updatePs.setDate(2, new java.sql.Date(anEmployee.getDateOfBirth().getTimeInMillis()));
      updatePs.setInt(3, anEmployee.getDepartmentNumber());
      updatePs.setInt(4, anEmployee.getEmployeeNumber());
      updatePs.executeUpdate();
      updatePs.close();
      conn.commit();
      disconnect();
   }
   catch (SQLException exception) {
      exception.printStackTrace();
   }
   return true;
}
--------------------------------------------------------

これも、ほとんどinsertData()メソッドを作ったときと同様のソー
ス・コードですから、説明しなくても理解できますね。

一言だけ説明しておくと、insertData()メソッドは新規登録を行う
ためのものですから、あらかじめ同じ社員番号のデータが「存在し
ない」ことを確認しておくのに対し、updateData()メソッドのほう
は既に存在している社員のデータに対してデータの変更を行うため
のものですから、あらかじめ同じ社員番号のデータが「存在してい
る」ことを確認しています。


では、続いてHumanResourceEntryPane側の編集を行いましょう。

HumanResourceEntryPaneのエディター(WindowBuilder Editor)を開いて
Designビューにおいて「更新」のページを表示してください。

「更新」ボタンを右クリックし、「Add event handler」→「アクション」
→「actionPerformed」を選択します。

そうすると、getJButtonUpdate()メソッドの中に下記のソース・コード
が自動生成されますね。

--------------------------------------------------------
jButtonUpdate.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
   }
});
--------------------------------------------------------

これを下記のように編集しましょう。

--------------------------------------------------------
jButtonUpdate.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
      Employee anEmployee = new Employee();
      int empNumber;
      try {
         empNumber = Integer.parseInt(getJTextFieldEmpNum().getText());
      }
      catch (NumberFormatException e1) {
         getMessageDialog().getTextPane().setText("エラー:社員番号の入力値が数字になっていません。");
         getMessageDialog().setVisible(true);
         return;
      }
      anEmployee.setEmployeeNumber(empNumber);
      anEmployee.setName(getJTextFieldName().getText());
      CalendarConverter aCalConverter = new CalendarConverter();
      aCalConverter.setDay(Integer.parseInt(getJTextFieldDay().getText()));
      aCalConverter.setMonth(Integer.parseInt(getJTextFieldMonth().getText()));
      aCalConverter.setJaNameOfEra(getJComboBoxEra().getSelectedIndex());
      switch (aCalConverter.getJaNameOfEra()) {
      case 0:
      case 1:
      case 2:
      case 3:
         aCalConverter.setJaYear(Integer.parseInt(getJTextFieldYear().getText()));
         aCalConverter.convertJaCal2GreCal();
         break;
      default:
         aCalConverter.setGreYear(Integer.parseInt(getJTextFieldYear().getText()));
         break;
      }
      anEmployee.setDateOfBirth(aCalConverter.getGreYear(), aCalConverter.getMonth(), aCalConverter.getDay());
      ComboBoxModelOfDepartment aBoxModelOfDepartment = (ComboBoxModelOfDepartment) getJComboBoxDepart().getModel();
      Department aDepartment = (Department)aBoxModelOfDepartment.getDepartmentList().get(getJComboBoxDepart().getSelectedIndex());
      anEmployee.setDepartmentNumber(aDepartment.getDepartmentNumber());
      EmployeeDbManager empDbManager = new EmployeeDbManager();
      if (empDbManager.updateData(anEmployee)) {
         getMessageDialog().getTextPane().setText("更新が完了しました。");
         getMessageDialog().setVisible(true);
      }
      else {
         getMessageDialog().getTextPane().setText("指定された社員番号が存在しないため、更新はできませんでした。");
         getMessageDialog().setVisible(true);
      }
   }
});
--------------------------------------------------------

このソース・コードも、もう説明不要ですね。


編集が終わったらテスト(HumanResourceJFrameの実行)をしてみま
しょう。
「検索」のページ(「検索」タブをクリックする)で「検索」ボタン
をクリックし、JTableに表示されたリストの中から好きな行を選択
(クリック)してから、「更新」のページを開いて(「更新」タブを
クリックして)ください。
「更新」のページに表示されたデータのうち「社員番号」以外のデー
タを変更してから、「更新」ボタンをクリックしてください。
ダイアログウインドウが開いて(ソース・コードで組み込んだ通りの)
メッセージが表示されることを確認しましょう。

これで「更新」の基本的な機能は完成しました。
(使い勝手をよくするために、もう少しソース・コードを追加/変更
したいという人は、どうぞ自分でやってください。)


では、今回はここまで。


(続く)



========================================================
◆ 02.文法解説 [do-while文]
========================================================

[do-while文]

以前紹介したwhile文、すなわち

--------------------------------------------------------
while (論理式) {
   <実行したい文>
}
--------------------------------------------------------

という構文によく似たループには、他にdo-while文というものが
あります。
これは、

--------------------------------------------------------
do {
   <実行したい文>
} while (論理式);
--------------------------------------------------------

という構文で、「論理式と書いた部分がtrueの値を返す間はブロッ
ク({と}の間)を繰り返し実行する」という点ではwhile文と同じ
ですが、ただし、while文では先に論理式を評価(evaluate = その
値を調べること)して、その結果に応じて<実行したい文>を実行す
るかどうかを判断するのに対し、do-while文では、まず<実行した
い文>を実行してから論理式を評価し、その結果に応じて次に<実行
したい文>を実行するかどうかを判断するという点が異なります。

したがってdo-while文では、<実行したい文>は最低一回は必ず実行
されるという点がwhile文と異なります。


たとえば、

--------------------------------------------------------
int i = 0;
do {
   i += 10;
   System.out.println("i = " + i);
} while(i < 0);
--------------------------------------------------------

とすると、ブロックの中は1回だけ実行され、コンソールには

i = 10

という文字列が1回だけ出力されることになります。


(続く)



================================================
◆ 03.演習問題
================================================

上記のdo-while文の振る舞いを確認するために、下記の
ようなプログラムを作って実行してみてください。
そして、自分で理解している通りの結果が出ることを確認
してください。

--------------------------------------------------------
public class DoWhileTest {

   public static void main(String[] args) {
      System.out.println("[Example 1]");
      int i = 0;
      do {
         i += 10;
         System.out.println("i = " + i);
      } while(i < 0);

      do i += 10;
      while(i < 100);

      System.out.println("i = " + i);

      String[] a = {"日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜"};
      int j = 0;
      do {
         System.out.println((j + 1) + "日目は" + a[j] + "。");
         j++;
      } while(j < a.length);

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


(次回に続く。)



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      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. 不許無断複製