NetBeans での単純な MySQL クライアントの作成

NetBeans には DB 接続用の優れたインタフェースが用意されていますが、多くの SQL コマンドは完全な文として入力する必要があるため、MySQL データベースへのデータの挿入やデータの表示を行うための Swing アプリケーションを作成しました。このサンプルは非常に簡単なもので、ある特定の表でしか使用できず、削除や更新の操作も行えません。拡張することも可能でしたが、ドキュメントが長く複雑になるので断念しました。

索引

MySQL データベースへの接続

読者のもとにはすでに、動作する MySQL データベースサーバーの適切な環境が存在し、ある特定のユーザーに十分な権限が与えられたデータベースが存在するものとします。この例では、

database name: nonidb
user: noniko
password: (空)
<- これが単なるサンプルにすぎないためです。何らかの重要なデータがある場合は、適切なパスワードを設定してください。

また、MySQL 用の JDBC ドライバファイルを入手します。ここでは、MySQL 開発者の Web サイト経由で mysql-connector-java-3.1.6-bin.jar ファイルを準備しました。

それでは、NetBeans を開きましょう。おそらく通常は「プロジェクト」または「ファイル」ウィンドウが表示されているので、「実行時」タブをクリックしてウィンドウを切り替えます。

「実行時」ウィンドウで「ドライバを追加」を選択します

ここに「データベース」ノードがあります。このノードを開き、その下にある「ドライバ」ノードを表示します。さらに開いて「ドライバ」の内容を表示すると、「JDBC-ODBC」のみが見つかります。まずやるべきことは、MySQL のドライバを追加することです。「ドライバ」ノードを右クリックしてコンテキストメニューを表示し、「ドライバを追加」を選択します。

すると、設定ウィンドウが表示されます。

JDBC ドライバファイルの場所を検索します。

「追加」ボタンをクリックすることで、ドライバファイルを視覚的に検索できます。上の場合のように、ここでは、プロジェクトフォルダを格納するための D:\nonidata\nb4worksnew フォルダと、ライブラリファイルを格納するための lib サブフォルダを準備しました。

ドライバファイルの場所を選択すると、「ドライバクラス」と「名前」が自動的に設定されます。MySQL JDBC ドライバの場合、最初は古いクラス名が設定されます。しかし、「検索」ボタンをクリックすると、下にある進捗バーがアクティブになり、最終的に「ドライバクラスの検索を完了しました」と表示されます。

次に、「ドライバクラス」設定のコンボを開きます。JDBC ドライバの現在のクラス名を選択できます。

クラス名を現在のバージョンの名前に変更します。

「了解」をクリックすると、「ドライバ」ノードの下に新しいドライバのノードが追加されます。それを右クリックし、コンテキストメニューから「接続...」を選択します。

コンテキストメニューから「接続...」を選択します

設定ウィンドウが表示されます。ここで、「データベース URL」、「ユーザー名」、および「パスワード」が必要になります (この場合、「パスワード」は空にします)。「了解」をクリックすると、下の進捗バーに「接続が確立されました」というメッセージが表示されます。このページを「詳細」に切り替えることも可能ですが、この場合は詳細設定は不要です。

接続が確立されると、この接続のノードが表示されます。では次の手順に進みましょう。

サンプル表の作成

先に確立された接続のノードを右クリックし、「表を作成...」を選択します。

コンテキストメニューから「表を作成...」を選択します

すると、作成する表の設定を行うためのウィンドウが表示されます。必要な設定を表示するには、このウィンドウを手動で拡大する必要がある場合があります。重要な設定は、「キー」、「列名」、「データ型」、およびデータ型によっては「サイズ」です。

NetBeans での表の作成

ここでは、caridnamevendor、および type をフィールドとして持つサンプル表「cars」を作成しました。フィールド carid が主キーです。データ型は、すべてのフィールドで VARCHAR です。サイズは、carid のみが 10、その他はすべて 20 です。

表が作成されると、そのノードが接続ノードの下に表示されます。表「cars」の構造が表示されます。

作成された表のノードツリー

最初のデータの挿入

次に、SQL コマンドを送信して最初の行を挿入しましょう。接続ノードの下の任意のノードを右クリックし、「コマンドを実行...」メニュー項目を表示します。

すると、操作コマンド用の大きなウィンドウが、ソースエディタと同じ場所に表示されます。大きすぎるので、その外観全体のスクリーンショットは示しません。重要な部分は、まず何と言っても、コマンド入力用のテキスト領域です。

コマンド文の全体を入力します。

「実行」ボタンをクリックすると、コマンドが有効である場合は、「コマンドが正常に実行されました」というメッセージが下に表示されます。さらに確認するために、「cars」ノードを右クリックし、「データを表示」を選択します。

「cars」ノードを右クリックしてデータを表示します。

挿入された最初のデータ

成功です。最初のデータが正常に挿入されました。しかし、「insert into...」のように文全体を入力するのは面倒だと思われるかもしれません。筆者はそうでした。それで、よりグラフィカルな操作でデータを挿入するアプリケーションを構築しようと決心したのです。

Java プロジェクトの新規作成

アプリケーション用に新しい Java プロジェクトを作成しましょう。メニューバーから「ファイル」->「新規プロジェクト」を選択します。新規プロジェクトのウィザードで、「一般」->「Java アプリケーション」をプロジェクトの種類として選択します。ここでは、プロジェクト名は「mysqloperation」、場所は「d:\nonidata\nb4worksnew\mysqloperation」にしました。「主プロジェクトを作成」のチェックは外します。

プロジェクトを作成したら、新しいパッケージを作成します。ここでは「mysqlop」です。

データベースを接続するためのユーティリティークラスの作成

Java でのデータベース操作は非常に複雑であり、接続、文、結果セット、および多数の try と catch が必要となります。このため、そのような操作を扱うユーティリティークラスを使用しました。

そのコードの全体を次に示します: MyDBConnection.java

init() メソッドは、MySQL データベースに接続するためのものです。

getConnection() メソッドは、確立された接続をほかのクラスに提供する目的で、init() メソッドのあとで呼び出す必要があります。

2 つの close() メソッドと destroy() メソッドは、操作の終了を設定するためのものです。接続、文、結果セットを閉じる際に try と catch が必要になるので、それらをここに抽出しました。

このファイルを使用するには、このプロジェクトで JDBC ドライバへのクラスパスを設定する必要があります。「mysqloperation」プロジェクトを右クリックし、コンテキストメニューから「プロパティー...」を選択します。「プロジェクトプロパティー」ウィンドウで、「構築」->「ソースのコンパイル」を選択します。JDBC JAR ファイルの場所を検索できるように、「ソースをコンパイルするためのクラスパス」設定の近くにある「JAR/フォルダを追加...」ボタンをクリックします。

クラスパスへの JDBC JAR ファイルの追加

表モデルの作成

続いて、このアプリケーションで使用する、JTable 用にカスタマイズされた表モデルを準備しました。

そのコードの全体を次に示します: CarTableModel.java

このコードを記述する際に、NetBeans の便利なツールをいくつか使用しました。
まず、CarTableModel.java という名前の新しい Java クラスファイルを作成します。これは非常に単純な空のテンプレートであり、パッケージとクラスの宣言しかありません。


このクラスの宣言を手動で編集し、「AbstractTableModel」クラスを拡張するようにします。エディタ内にすぐに、エラーを示す赤色の波下線が表示されます。その原因の 1 つは、「javax.swing.table.AbstractTableModel」クラスがインポートされていないことです。このエラーを修正するには、コードのどこかで右クリックし、「インポートを修正」を選択します。

「インポートを修正」ツールを使用します

宣言

import javax.swing.table.AbstractTableModel;

がソースコードの先頭の近くに挿入されたことを確認できます。

しかし、赤色の下線がまだ残っています。その残りの原因は、適切な抽象メソッドが実装されていないことです。
これを修正するには、「メソッドをオーバーライド」ツールを次のようにして呼び出します。

「メソッドをオーバーライド」ツールを使用します

「抽象メソッドのみ表示」をオンにすると、必要な実装が抽出されます。

必要な実装が一覧表示されます

ノードをクリックして 3 つのメソッドをすべて選択し、「了解」をクリックします。

必要な実装が自動的に挿入されます

これで赤色の線が消えました。

実際には、getColumnName(int param) メソッドもオーバーライドする必要があります。そうしないと、表のカスタマイズされたヘッダーを取得できません。

では内容を埋めましょう。
このコードの仕様では、特定の表「cars」にアクセスするようになっているので、列の数は 4 に固定されます。
各列の名前もわかっており、直接設定できます。

今回は、JDK5.0 の新機能である総称をはじめて使用しました。これは、NetBeans で正常に動作しました。

JFrame フォームクラスの作成 - フォームデザイン

次に、JFrame フォームアプリケーションを作成しましょう。このプロジェクトの主クラスです。新規ウィザードで「JFrame フォーム」を選択できます。ここでは、名前は「InsertTable」にします。すると、ソースファイル「InsertTable.java」が作成されました。

まず、フォームのデザインを行います。そのウィンドウは縦長になるはずなので、「パッキング」を使用せずにフォームサイズを修正しました。
インスペクタウィンドウで「JFrame」ノードを選択し、そのプロパティーを表示します。「フォームサイズポリシー」を、デフォルトの「pack() を生成」から「サイズ変更コードの生成」に変更します。

フォームサイズを修正する方法。

すると、「フォームのサイズ」プロパティーが編集可能になります。これを次のように編集します。

フォームのサイズを編集します。

このフォームは垂直方向に 3 つの部分に分けられます。

(1) 新しいデータを入力するための JTextField または JComboBox。
(2) データの送信とメッセージの表示を行うための JButton。
(3) JTable。

最初の 2 つはそれぞれの JPanel 上に配置し、JTable は JScrollPane 上に配置するようにしてください。これが基本的な部分です。

コンポーネントの配置先となる JPanel と JScrollPane。

各ノードの垂直方向の位置は、実際の位置を意味しているわけではありません。つまり、dataPanel、sendPanel、tablePane はそれぞれ BorderLayout の北、中央、南に配置されます。

dataPanel には、データ入力用の 3 つの JTextField と 1 つの JComboBox、および説明用の 4 つの JLabel を配置するようにしてください。筆者は、GridLayout がこれらの位置を設定するのに最適であると判断しました。NetBeans では、JPanel のデフォルトのレイアウトは FlowLayout です。これを変更する必要があります。

GridLayout に変更します

すると、この GridLayout のプロパティーが表示されます。列数を 2 に、行数を 4 に設定します。

次に、コンポーネントを配置します。それらの位置に満足できない場合は、フォーム上でドラッグ&ドロップすることでそれらを移動できます。

GridLayout 内での JComboBox の移動。

別のパネル上など、完全に間違った位置にコンポーネントが移動してしまう場合もあります。心配する必要はありません。インスペクタウィンドウ内でもドラッグ&ドロップでその位置を移動できます。

インスペクタウィンドウ内での JComboBox の移動。

すべてのコンポーネントを設定したら、それらの名前をカスタマイズし、それぞれの役割がわかるようにします。
さらに、各 JLabel の text プロパティーをカスタマイズし、各 JTextField のその値を消去します。JPanel の「text」プロパティーの編集例を、次に示します。

JLabel として「ID:」が表示されるように「text」プロパティーをカスタマイズします

次に、JButton と JLabel の配置先となる sendPanel です。この JPanel でも GridLayout を設定し、列数は 1、行数は 2 にします。名前と「text」プロパティーをカスタマイズします。

これで、JTable 以外のコンポーネントが次のように配置されます。

JTable 以外のコンポーネントがカスタマイズされました。

JTable のカスタマイズ

上で示したように、この時点では、JTable の構造は 4x4 で、データは空です。これをカスタマイズし、MySQL データベースの表「cars」の内容が表示されるようにしましょう。

この時点で「carTable」という名前になっている JTable をインスペクタウィンドウで選択し、そのプロパティーを表示します。「model」プロパティーを探し、その右端の「...」ボタンをクリックします。

carTable とその「model」プロパティー

すると、エディタウィンドウが表示されます。このウィンドウではデフォルトの 4x4 構造が設定されています。「モードを選択」を「TableModelEditor」から「FormConnection」に変更しましょう。

デフォルトの表モデルエディタモードからフォーム接続モードへの切り替え。

フォーム接続モードで、オプションウィンドウ内の「ユーザーコード」のラジオボタンをクリックします。

フォーム接続モード

次に、このウィンドウの下部を見てください。「拡張機能」ボタンがあります。これをクリックします。

ウィンドウ下部の「拡張機能」ボタン

JTable の表モデルを設定するコードの前後を編集するためのウィンドウが表示されます。ここでは両方をオンにして編集します。

「InsertTable.java」のソースコード内で、getResultFromCars という名前のメソッドを次のように手動で作成します。


 public ResultSet getResultFromCars() {
        
        ResultSet rs=null;
        
        try{
            rs=stmt.executeQuery("Select * from cars");
        
        }
        catch(SQLException e){}
        
        return rs;
        
    }

「了解」をクリックして「ユーザーコード」に戻り、入力します。

ここで、文を終了させるセミコロン「;」は入力しないようにしてください。これには理由があります。ソースコードをチェックしてください。InitComponents() メソッドをチェックします。ここです。

薄青色は「保護」された「編集不可能」な領域でしょうか。だれがそう言ったのでしょうか。実際はそうではありません。NetBeans に用意されているこの方法で、自由に編集できます。

InsertTable の初回実行

このカスタマイズされた JTable の最初のテスト実行を行う前に、まだやるべきことがあります。まず、宣言です。

private MyDBConnection mdbc;
private java.sql.Statement stmt;

これらは、ソース内のどこかに記述する必要があります。ファイルの終わりの近くで、ほかの変数に近い場所がお勧めです。

次はコンストラクタです。これに throw 宣言を追加すべきですが、

これは、「java.sql.SQLException は報告されません...」という不愉快なコンパイルエラーを回避するためです。

コンストラクタの内容の全体を次に示します。

 
public InsertTable() throws  Exception{
        
         mdbc=new MyDBConnection();
         mdbc.init();
         Connection conn=mdbc.getMyConnection();
         stmt= conn.createStatement();
        
        initComponents();
    }

 

同じコンパイルエラーを回避するためにやるべきことが、もう 1 つあります。NetBeans によって準備された main メソッドを編集します。

main メソッドに try-catch を追加します

ここでプロジェクトを実行してみましょう。主クラスを選択するためのウィンドウが表示される場合があります。リストに含まれているのは、この「InsertTable.class」だけです。それを選択します。

MySQL の表データが表示されました

MySQL データベースの「cars」表に唯一存在する 1 行が表示されました。

微調整...

MySQL 内の既存のデータを JTable に表示できたので、あとは一息ついて微調整を行い、アプリケーションを改善しましょう。

1 つは、このアプリケーションを正しく終了させることです。MySQL とのすべてのセッション (接続、文、結果セット) を閉じる必要があります。
このアプリケーションは、ウィンドウを閉じることで終了します。したがって、WindowClosing イベントのイベント処理メソッドを追加すべきです。
インスペクタウィンドウで「JFrame」を選択してそのプロパティーウィンドウを表示したあと、「イベント」をクリックしてページを切り替えます。「windowClosing」イベントを探します。これはデフォルトで <なし> に設定されていますが、単語 <なし> をクリックすると、それが自動的に「formWindowClosing」に変更されるので、この行が選択された状態で Enter キーを押します。

JFrame の windowClosing イベントの設定

するとソースコードが表示され、メソッドが編集可能になります。

「formWindowClosing」メソッドを編集します

文と接続を閉じます。

もう 1 つは、typeCombo という名前の JComboBox の項目を設定することです。そうです、車の駆動タイプを選択する機能をこれに追加すべきなのです。

インスペクタウィンドウで「typeCombo」ノードを選択し、そのプロパティーを表示します。JTable の表モデルを設定する際に行なったのとまったく同様に、「model」プロパティーを探し、その右端の「...」ボタンをクリックします。
ウィンドウが表示されます。今回はデフォルトの ComboBoxModelEditor を使用します。

「項目:」フィールドに新しい項目を入力し、「追加」ボタンをクリックします。簡単です。項目「FF」、「FR」、「MR」、および「4WD」を駆動タイプとして準備しました。ほかに何かありますか。

MySQL へのデータの挿入

最後の追い込みに入ります。MySQL へのデータ挿入は、「Send」ボタン (「sendButton」という名前の JButton) のクリック時に行われるようにすべきです。

NetBeans の GUI エディタで JButton のイベント処理メソッドを作成するのは、非常に簡単です。フォーム上の JButton 自体をダブルクリックするだけです。

「sendButtonActionPerformed」メソッドがソースファイル内に作成されます。その内容を次のように入力しましょう。

private void sendButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
FIRST:event_sendButtonActionPerformed
        // TODO ここに処理コードを追加してください:
        
        String carid=idField.getText();
        String name=nameField.getText();        
        String vendor=vendorField.getText();
        String type=(String)typeCombo.getSelectedItem();
        
        String insertStr="";
        
        try{
            
            insertStr="insert into cars (carid, name, vendor, type) values("
                    +quotate(carid)+","
                    +quotate(name)+","
                    +quotate(vendor)+","
                    +quotate(type)
                    +")";
            
            int done=stmt.executeUpdate(insertStr);
            
            commentLabel.setText("1 row inserted");
           
            getContentPane().removeAll();
            initComponents();
        
        }
        catch(Exception e){
            commentLabel.setText("Error occurred in inserting data");
            e.printStackTrace();
        }
        
    }//GEN-LAST:event_sendButtonActionPerformed

データの挿入後かつ現在のコンテンツ区画の削除後に、initComponents メソッドが呼び出されています。これは、JTable の表示を更新するために必要です。筆者にもう少しスキルがあれば、コンテナの全体ではなく JTable のみを更新できたと思います。この方法は、日本語で言うところの「豆腐を斧で切る」ようなものです。申し訳ありません。

また、ここでは quotate メソッドが呼び出されています。これを作成したのは、あまりに多くの引用符を入力しないようにするためです。

 public String quotate(String content){

return "'"+content+"'";
}

ここで、InsertTable.java のコード全体を示します。

プロジェクトを実行してください。データを入力し、「Send」ボタンをクリックします。すると、JTable に挿入されたばかりの行がもう 1 つ表示されます。もう何回か挿入を繰り返してください。

完成したアプリケーションの操作

そして、NetBeans のユーティリティーからもこれらのデータが表示されることを確認しておきましょう。

お疲れさまでした。しかし、このプロジェクトを通じて次のことを学べました。

  • NetBeans のユーティリティーからデータベースを操作する方法
  • 薄青色領域の「保護」されたコードを編集する方法
  • JTable のカスタマイズされた表モデルを使用する方法

などです。

 

By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2018, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo