2012-06-08 4 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 заблокирует ваш пользовательский интерфейс. Обратитесь к учебнику Concurrency in Swing для получения дополнительной информации о Swing and threading
  • Рассмотрите вопрос о кешировании объекта Connection
  • Не забудьте закрыть ваши ресурсы. Если я правильно помню, то ResultSet должен быть закрыт. Сделайте это в блоке finally
+0

Я попытаюсь просто вызвать этот метод. Следуйте за своим предложением, так что вы говорите, что я должен создать отдельный класс для выполнения sql-запроса? я собираюсь прочитать в EDT (Thread Dispatch Thread), но если вы могли бы объяснить больше. Я думаю, вы говорите, что я должен создать хранимую процедуру и вызывать ее вместо этого. – rambokayambo

+0

@ user1332681 Я говорю, что вы должны выполнять запрос своей базы данных и разбор этих результатов в другом потоке, а не только на другом методе. В противном случае вы получите невосприимчивый пользовательский интерфейс – Robin

+0

, к сожалению, я новичок, и я не знаю, как сделать многопоточное программирование – rambokayambo

Смежные вопросы