2012-06-20 39 views
5

Trước hết xin lỗi vì tên của tiêu đề, nhưng tôi không biết cách đặt một tên khác vì tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi.Kết nối JDBC sử dụng các tệp khác nhau

tôi có phương pháp sau đây để kết nối với một cơ sở dữ liệu:

import java.sql.DriverManager; 
import java.sql.Connection; 
import java.sql.SQLException; 

public class PgConnect { 
    public void connect() { 
     Connection connection = null; 
     try { 
      connection = DriverManager.getConnection("jdbc:postgresql://pgserver:5432/db", "test","test123"); 
     } catch (SQLException e) { 
      System.out.println("Connection Failed! Check output console"); 
      e.printStackTrace(); 
      return; 
     } 
     if (connection != null) { 
      System.out.println("Connection working"); 
     } else { 
      System.out.println("Failed to make connection!"); 
     } 
    } 
} 

Và những gì tôi cần làm là bao gồm các phương pháp từ PgConnect trong các mã dưới đây. Về cơ bản tôi cần điều này bởi vì tôi có nhiều loại cuộc gọi của SQL đến cơ sở dữ liệu, và việc thay đổi điều này theo cách đó sẽ dễ dàng duy trì, vì thông tin đăng nhập/máy chủ sẽ chỉ có trên một tệp.

Tôi tin rằng sự thay đổi nên nơi tôi có những nhận xét

// i want to change this, for using the method on the first file. 

Xin vui lòng sửa cho tôi nếu tôi sai.

import java.sql.DriverManager; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class ReturnResults { 

    public static void main(String[] args) { 
     Connection connection = null; 
     try { 
       // i want to change this, for using the method on the first file. 
      connection = DriverManager.getConnection("jdbc:postgresql://pgserver:5432/db", "test","test123"); 

     } catch (SQLException e) { 
      System.out.println("Connection Failed! Check output console"); 
      e.printStackTrace(); 
      return; 
     } 
     if (connection != null) { 

      String result = null; 
      String selectString = "select * from mwp.servers where env='TEST' order by server"; 
      //result ="iServer\tLabel\n"; 

      try { 

       Statement stmt = connection.createStatement(); 
       ResultSet rs = stmt.executeQuery(selectString); 

       while (rs.next()) { 

        String iEnv  = rs.getString("env"); 
        String iServer = rs.getString("iserver"); 
        String iLabel = rs.getString("label"); 
        String iTitle = rs.getString("title"); 
        String iLogin = rs.getString("login"); 

        result=iEnv+"\t"+ iServer+"\t"+iLabel+"\t"+iTitle+"\t"+iLogin; 

        System.out.println(result); 
       } 
       stmt.close(); 
       connection.close(); 

      } catch(SQLException ex) { 
       System.err.println("SQLException: " + ex.getMessage()); 
      } 

     } else { 
      System.out.println("Failed to make connection!"); 
     } 
    } 
} 

Tôi biết cách thực hiện điều này trên Perl, nhưng tôi không có bất kỳ thực hành nào trong Java.

Trả lời

3

Một cách để che giấu các thông tin sẽ được làm connect một hàm tĩnh trở Connection, như thế này:

public class PgConnect { 
    public static Connection connect() throws SQLException { 
    try { 
     Connection res = DriverManager.getConnection("jdbc:postgresql://pgserver:5432/db", "test","test123"); 
     if (res != null) { 
      System.out.println("Connection working"); 
     } else { 
      System.out.println("Failed to make connection!"); 
     } 
     return res; 
    } catch (SQLException e) { 
     System.out.println("Connection Failed! Check output console"); 
     e.printStackTrace(); 
     throw e; 
    } 
} 

}

Sau đó, bạn có thể sử dụng nó như thế này:

try { 
    connection = PgConnect.connect(); 
} catch (SQLException e) { 
    System.out.println("Connection Failed! Check output console"); 
    e.printStackTrace(); 
    return; 
} 
+0

Giải pháp này đã hoạt động như dự định.Tôi đã thực hiện sugestion chính xác mà bạn đã cung cấp và hiện có thể để tiến hành. Cảm ơn bạn. –

3

Hãy connect() phương pháp của bạn static và sau đó bạn có thể gọi nó như thế này

Connection con = PgConnect.connect(); 

Cũng chỉnh sửa phương pháp của bạn kết nối với Connection, bởi vì bạn cần phải trả lại Connection không void.

public static Connection connect() throws SQLException { 
    try { 
     Connection con = DriverManager.getConnection("jdbc:postgresql://pgserver:5432/db", "test","test123"); 
     // ... 
     return con; 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 
     return null; 
    } 

Ngoài ra còn có một cách tiếp cận rõ ràng hơn. Đây là ví dụ từ dự án cũ của tôi.

private static DataSource getOracleDBConnection() throws NamingException { 
     Context c = new InitialContext(); 
     return (DataSource) c.lookup("java:comp/env/OracleDBConnection"); 
    } 

    public static Connection getOracleDatabaseConnection() { 

     Connection conn = null; 
     try { 
      conn = OracleDAOFactory.getOracleDBConnection().getConnection(); 
     } 
     catch (NamingException ex) { 
      Logger.getLogger(OracleDAOFactory.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     catch (SQLException ex) { 
      Logger.getLogger(OracleDAOFactory.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return conn; 
    } 

Tôi đang sử dụng NetBeans vì vậy tôi không biết làm thế nào bạn có thể làm điều này trong IDE khác nhưng khi bạn đẩy ALT+Insert, sẽ được hiển thị ít menu và bạn có thể chọn "cơ sở dữ liệu sử dụng .. . " và tạo tự động chỉ với một vài cú nhấp chuột Connection của bạn vào cơ sở dữ liệu.

1

Bạn có thể sử dụng phương pháp được chỉ định ở trên, thay vì trả lại void trả lại kết nối:

public class PgConnect { 
    //changing the method declaration to return a Connection 
    public Connection connect() { 
     Connection connection = null; 
     try { 
      connection = DriverManager.getConnection("jdbc:postgresql://pgserver:5432/db", "test","test123"); 
     } catch (SQLException e) { 
      System.out.println("Connection Failed! Check output console"); 
      e.printStackTrace(); 
      return null; 
     } 
     if (connection != null) { 
      System.out.println("Connection working"); 
     } else { 
      System.out.println("Failed to make connection!"); 
     } 
     return connection; 
    } 
} 



public class ReturnResults { 

    public static void main(String[] args) { 
     Connection connection = null; 
     PgConnect oPgConnect; 
     try { 
     //this is where you call your method object... 
     oPgConnect = new PgConnect(); 
     //once created, you call the method to get the connection... 
     connection = oPgConnect.connect(); 
     //after get the connection, keep with the method logic... 
     if (connection != null) { 
      //your logic code... 
     } 
    } 
} 
1

Theo tôi được biết, bạn muốn gọi phương thức connect() từ PgConnect.java vào ReturnResults.java để bạn có thể sử dụng đối tượng Connection.

Bạn có thể làm 2 việc -

  1. Bạn có thể kéo dài tuổi PgConnect.java trong ReturnResults.java như public class ReturnResults extends PgConnect và sau đó sử dụng phương pháp connect.
  2. Bạn có thể đặt lớp tĩnh PgConnect và sử dụng nó như PgConnect.connect() trong lớp ReturnResults.
0

Bạn có nói rằng bạn muốn rút kết nối vào chức năng riêng của nó, vì vậy bạn có thể gọi nó mỗi khi bạn cần thực hiện cuộc gọi sql? Có vẻ như đó là những gì bạn đang xin lỗi nếu tôi tắt cơ sở ....

Nhưng nếu đó là những gì bạn đang hỏi thì bạn đang đi đúng hướng vì đây là một điều tiêu chuẩn để làm ...

Tại sao bạn không thử điều này, tôi đã cố gắng để không chỉ cung cấp cho bạn một câu trả lời nhưng thiết lập cho bạn một số thực hành tốt nhất để giúp bạn bắt đầu và làm cho bạn cuộc sống dễ dàng hơn. .... (Tôi cho rằng PGConnect.java nằm trong cùng một gói, nếu không giải quyết địa chỉ của bạn cho phù hợp. Rất nhiều bài viết khác trên SO sẽ mô tả điều đó. Một điều cơ bản trong java/hầu hết các ngôn ngữ lập trình.) Cập nhật đầu tiên của bạn tập tin để trông như thế này, thông báo tôi đang làm cho các chức năng để có được kết nối tĩnh và tôi đi qua các ngoại lệ cho phương pháp gọi, điều này là để chúng tôi có thể xử lý những trường hợp ngoại lệ trên cơ sở từng trường hợp. Tôi thậm chí muốn chuyển chúng ra khỏi lớp dữ liệu để bạn có thể có báo cáo lỗi tốt trong ứng dụng của mình, nhưng điều đó phụ thuộc rất nhiều vào cách bạn thiết kế ứng dụng đó.

package DatabaseCodePackage; //name you package something descriptive, its your call place both files into this package. 

import java.sql.DriverManager; 
import java.sql.Connection; 
import java.sql.SQLException; 

public class PgConnect { 

    public static Connection getConnection(String username, String password) throws SQLException 
    { 
     return DriverManager.getConnection("jdbc:postgresql://pgserver:5432/db", username, password); 
    } 

Cập nhật tập tin thứ hai để một cái gì đó như thế này .... trực tiếp gõ lệnh SQL vào JDBC được đánh giá cao dicouraged nếu bạn đang sử dụng bất kỳ giá trị tìm kiếm động, mà tôi giả sử bạn cuối cùng sẽ làm, vì hầu hết mọi ứng dụng sẽ làm điều đó ở đâu đó. xem http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html Báo cáo đã chuẩn bị đã sử dụng. Ive viết lại SQL của bạn để sử dụng một statment đã chuẩn bị.

package DatabaseCodePackage; //name you package something descriptive, its your call place both files into this package. 

import java.sql.DriverManager; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 


public class ReturnResults { 

public static void main(String[] args) { 

    Stirng result = null; 
    try{ 
     result = selectAllWithEnv("TEST"); 

     // I catch exceptions here because i like to let exception pass entirely out of the 
     // data layer, this way the control logic calling for the database information can decide what to do when it 
     // cant get the information it wants. This is especailly good in a MVC type project. 
    } catch (NullPointerException npe){ 
     result = "Connection Failed! Check output console : " + e.getMessage(); 
     e.printStackTrace(); 
     return; 
    } catch (SQLException e) { 
     result = "SQL failure! Check output console : " + e.getMessage(); 
     e.printStackTrace(); 
     return; 
    } finally { 
     System.out.println(result); 
    } 
} 

public static String selectAllWithEnv(String var) throws SQLException, NullPointerException { 
    String SQL = "select * from mwp.servers where env=? order by server"; 
    Connection connection = null; 
    StringBuilder sb = new StringBuiler(); 
    try { 
     connection = PgConnect.getConnection(); 
     PreparedStatement ps = connection.prepareStatement(SQL); 
     ps.setObject(1, var); 
     ResuletSet rs = ps.executeQuery(); 

     while (rs.next()) { 

      String iEnv  = rs.getString("env"); 
      String iServer = rs.getString("iserver"); 
      String iLabel = rs.getString("label"); 
      String iTitle = rs.getString("title"); 
      String iLogin = rs.getString("login"); 

      sb.append(iEnv + "\t" + iServer + "\t" + iLabel + "\t" + iTitle + "\t" + iLogin + "\n"); 
     } 
    } finally { 
     connection.close(); 
    } 
    return sb.toString(); 
} 

Cũng lưu ý tôi đặt con.close() trong khối cuối cùng. LUÔN LUÔN LUÔN LUÔN LUÔN LUÔN làm điều này. Nếu bạn kết thúc ném một excpetion trong khối thử, điều này sẽ đảm bảo rằng nó được gọi. Nếu bạn không làm điều này, bạn sẽ có kết nối mà vẫn còn sống trong thời gian rất dài và điều này có thể có tác động hiệu suất rất tiêu cực. Nếu bạn đang làm việc trong một môi trường doanh nghiệp, và bạn không làm điều này, bạn có thể sẽ có trường hợp của DBA về bạn tại một số điểm để không giết các kết nối ứng dụng của bạn. stmt.close() là dự phòng trên con.close() nếu bạn không sử dụng nhiều số liệu thống kê trên cùng một kết nối, do đó không có lý do gì để gọi khi gọi con.close()

Các vấn đề liên quan