0

私はJavaとNetBeansを初めて使用し、次のようなフォームを作成しようとしています。

  1. JDBC接続を使用してデータベースに接続します
  2. 7つの列から情報を読み取り、フォーム上にあるjTableコンポーネントに表示します

私はすでにこれを機能させています。私は今、コードを最適化し、より良いアーキテクチャを使用してデータベース接続とユーザーインターフェイス(UIフォーム)コードを分離しようとしています。これにより、接続を実行するための別のクラスを作成し、このクラスのメソッドを呼び出すだけで済みます。ボタンの後ろのコード。NetBeansとフォームを使用する際の問題は、このクラスなどをインスタンス化する場所がわからないことです。以下は、JDBC接続を実行するために作成したクラスの対応です。

public class ConnectionManager {
private static String url = "jdbc:mysql://localhost:3306/prototypeeop";
private static String driverName = "com.mysql.jdbc.Driver";
private static String username = "root";
private static String password = "triala";
private static Connection con;
private static String url;

public static Connection getConnection() {
    try {
        Class.forName(driverName);
        try {
            con = DriverManager.getConnection(url, username, password);
        } catch (SQLException ex) {
            // log an exception. fro example:
            System.out.println("Failed to create the database connection.");
        }
    } catch (ClassNotFoundException ex) {
        // log an exception. for example:
        System.out.println("Driver not found.");
    }
    return con;
}

}

これはすでに.javaファイルです。JFormがあり、ボタンの後ろでこのメソッドを呼び出す必要があります。これが、接続クラスを使用せずに現在の形式でそれを行う方法です。

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    DefaultTableModel model=(DefaultTableModel)jTable1.getModel();
    model.setRowCount(0);
    String sql="Select * from eopdata";
    try
    {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con=(Connection)DriverManager.getConnection("jdbc:mysql://localhost:3306/prototypeeop","root","jakamuga");
        Statement stmt=con.createStatement();
        ResultSet rs=stmt.executeQuery(sql);
        while(rs.next())
        {
            String Year=rs.getString("Year");
            String Month=rs.getString("Month");
            String Day=rs.getString("Day");
            String MJD=rs.getString("MJD");
            Double xarcsec=rs.getDouble("xarcsec");
            Double yarcsec=rs.getDouble("yarcsec");
            Double UT1UTCsec=rs.getDouble("UT1UTCsec");
            model.addRow(new Object[] { Year, Month, Day, MJD,xarcsec,yarcsec,UT1UTCsec});
        }
    }
    catch(Exception e) {
        JOptionPane.showMessageDialog(this, e.getMessage());
    }

接続でハードコーディングする代わりにクラスを使用するにはどうすればよいですか?クラスはすでに作成していますが、どこでインスタンス化できますか。フォームのメインで実行しますか、それとも次のコードを使用してactioneventコードで実行しますか?

private Connection con = null;
private Statement stmt = null;
private ResultSet rs = null;

con = ConnectionManager.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
4

1 に答える 1

3

あなたの質問に文字通り答えるには、あなたのgetConnectionメソッドはpublic staticメソッドなので、どこからでも呼び出すことができます。ConnectionManager.getConnection()その接続が必要な場所に電話するだけです。

コードに関するその他の注意事項:

  • actionPerformedメソッドでデータベースにクエリを実行しないでください。このメソッドは EDT で呼び出され、データベース クエリを実行して結果をループすることは、実行時間の長いタスクです。EDT でこのタスクを実行すると、UI がブロックされます。Swing とスレッド化の詳細については、Swingの同時実行のチュートリアルを参照してください。
  • Connectionオブジェクトのキャッシュを検討する
  • リソースを閉じることを忘れないでください。私の記憶が正しければ、ResultSet後で閉じる必要があります。これをfinallyブロックで行う
于 2012-06-08T15:57:31.980 に答える