2012-06-08 43 views
0

我是新来的Java和NetBeans,而我试图创建一个表单,摇摆形式的数据库连接

  1. 使用JDBC连接
  2. 读取七列信息连接到数据库,并显示在一个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); 

回答

3

要字面上回答你的问题:你的getConnection方法是public static方法,这样你就可以在任何地方调用它。只需拨打ConnectionManager.getConnection()即可 - 凡您需要该连接。

你的代码的一些其他备注:

  • actionPerformed方法你不应该查询数据库。在EDT上调用此方法,执行数据库查询并循环执行结果是一项长期运行的任务。在EDT上执行此任务将阻止您的用户界面。为左右摇摆更多信息和线程
  • 考虑缓存的Connection对象
  • 不要忘记关闭资源咨询Concurrency in Swing教程。如果我没有记错,之后必须关闭ResultSet。在finally块中做这件事
+0

我会尝试调用这个方法。跟进你的建议,你是说我应该创建一个单独的类来执行SQL查询呢?我将阅读美国东部时间(事件调度线程),但如果你能解释更多。我想你是说我应该创建一个存储过程并调用它,而不是 – rambokayambo

+0

@ user1332681我说你应该执行查询你的数据库和在不同的线程中解析这些结果,而不仅仅是一种不同的方法。否则,最终会出现无响应的UI – Robin

+0

不幸的是,我是一个新手,我不知道如何在不同的线程中执行多线程编程 – rambokayambo