2012-06-20 27 views
5

सबसे पहले शीर्षक के नाम के लिए खेद है, लेकिन मुझे नहीं पता कि अंग्रेजी कैसे एक और है क्योंकि अंग्रेजी मेरी मूल भाषा नहीं है।विभिन्न फ़ाइलों का उपयोग कर जेडीबीसी कनेक्शन

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!"); 
     } 
    } 
} 

और क्या मैं क्या करने की जरूरत नीचे कोड में PgConnect से विधि में शामिल है:

मैं एक डेटाबेस से कनेक्ट करने के लिए निम्न विधि है। असल में मुझे इसकी आवश्यकता है क्योंकि मेरे पास डेटाबेस के कई प्रकार के एसक्यूएल कॉल हैं, और इसे इस तरह से बदलना आसान होगा, क्योंकि क्रेडेंशियल/होस्ट केवल एक फाइल पर होंगे।

मेरा मानना ​​है कि मैं कहाँ टिप्पणी

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

कृपया मुझे ठीक कर लें मैं गलत हूँ है परिवर्तन होना चाहिए।

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!"); 
     } 
    } 
} 

मुझे पता है कि पर्ल पर ऐसा कैसे करें, लेकिन मेरे पास जावा में कोई अभ्यास नहीं है। क्योंकि आप Connection नहीं void वापस जाने के लिए की जरूरत है

उत्तर

3

एक तरह से साख को छिपाने के लिए Connection लौटने connect एक स्थिर समारोह बनाने की जाएगी, इस तरह:

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; 
    } 
} 

}

फिर आप इसे इस तरह इस्तेमाल कर सकते हैं:

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

पर यह कॉल करने का कोई कारण नहीं है। यह समाधान इरादे के रूप में काम करता था। मैंने आपके द्वारा दिए गए सटीक परेशानी को किया और अब मैं सक्षम हूं आगे बढ़ने के लिए धन्यवाद। –

3

अपने connect() विधि static करें और फिर आप इसे इस

Connection con = PgConnect.connect(); 

की तरह कॉल कर सकते हैं इसके अलावा अपने विधि Connection से कनेक्ट संपादित करें।

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; 
    } 

इसके अलावा एक और, क्लीनर दृष्टिकोण भी है। यहां मेरी पुरानी परियोजना से उदाहरण दिया गया है।

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; 
    } 
मैं NetBeans उपयोग कर रहा हूँ तो मैं कैसे आप इस अन्य IDEs में ऐसा करने में सक्षम हैं, लेकिन जब आप ALT+Insert धक्का, वहाँ थोड़ा मेनू दिखाया जाएगा पता नहीं है और आप "उपयोग डेटाबेस का चयन कर सकते

.. " और डेटाबेस पर अपने Connection कुछ क्लिक के साथ स्वचालित बनाएं।

1

आप उपरोक्त निर्दिष्ट विधि का उपयोग कर सकते हैं, void वापसी के बजाय कनेक्शन वापस करें:

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

मैं समझता हूँ के रूप में, आप ReturnResults.java में PgConnect.java से connect() विधि कॉल करने के लिए इतना है कि आप Connection वस्तु का उपयोग कर सकते हैं। आप public class ReturnResults extends PgConnect तरह ReturnResults.java में PgConnect.java का विस्तार और फिर connect विधि का उपयोग कर सकते हैं

  1. -

    आप 2 बातें कर सकते हैं।

  2. आप PgConnect कक्षा स्थैतिक बना सकते हैं और इसे कक्षा में PgConnect.connect() जैसे उपयोग कर सकते हैं।
0

क्या आप कह रहे हैं कि आप अपने स्वयं के फ़ंक्शन में कनेक्शन प्राप्त करना चाहते हैं, ताकि आप इसे हर बार कॉल कर सकें जब आपको एसक्यूएल कॉल करने की आवश्यकता हो? ऐसा लगता है कि अगर आप आधार से बाहर हैं तो मैं क्षमा चाहता हूं ....

लेकिन यदि आप यही पूछ रहे हैं तो आप सही रास्ते पर हैं क्योंकि यह एक मानक बात है ...

आप इसे क्यों न करें, मैंने आपको केवल जवाब देने की कोशिश की लेकिन आपको शुरू करने और आपको जीवन आसान बनाने के लिए कुछ सर्वोत्तम प्रथाओं के साथ स्थापित किया। .... (मुझे लगता है कि PGConnect.java उसी पैकेज में है, यदि तदनुसार आपके पते को हल नहीं किया गया है। SO पर अन्य पोस्टों का वर्णन यह होगा। जावा/अधिकांश प्रोग्रामिंग भाषाओं में इसकी मूल बात है।) अपना पहला अपडेट करें इस तरह दिखने के लिए फ़ाइल, ध्यान दें कि मैं कनेक्शन स्थिर प्राप्त करने के लिए फ़ंक्शन कर रहा हूं और मैं कॉलिंग विधि के अपवादों को पार कर रहा हूं, ऐसा इसलिए है कि हम मामले के आधार पर उन अपवादों को संभाल सकते हैं। मैं उन्हें डेटा परत से पूरी तरह से पास करना पसंद करता हूं ताकि आप अपने आवेदन में अच्छी त्रुटि रिपोर्टिंग कर सकें, लेकिन यह उस एप्लिकेशन पर डिज़ाइन करने के तरीके पर बहुत निर्भर है।

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); 
    } 

अद्यतन कुछ इस तरह से पीछे नहीं फ़ाइल .... सीधे टाइप अगर आप किसी भी गतिशील खोज मूल्यों, जो मुझे लगता है कि आप अंतिम करना होगा उपयोग कर रहे हैं JDBC में एसक्यूएल अत्यधिक dicouraged है, लगभग हर आवेदन के बाद से होगा वह कहीं करो। http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html प्रयुक्त तैयार कथन देखें। मैंने एक तैयार स्टेटमेंट का उपयोग करने के लिए अपने एसक्यूएल को फिर से लिखा।

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(); 
} 

नोटिस भी मैंने अंत में ब्लॉक में con.close() डाल दिया। हमेशा हमेशा ऐसा करते हैं। यदि आप कोशिश ब्लॉक में एक उत्तेजना फेंकने के अंत में, यह सुनिश्चित करेगा कि इसे बुलाया जाता है। यदि आप ऐसा नहीं करते हैं, तो आपके पास कनेक्शन होगा जो बहुत लंबे समय तक जीवित रहेगा और इसका बहुत नकारात्मक प्रदर्शन प्रभाव हो सकता है। यदि आप एंटरप्राइज़ एनविर्नमेंट में काम कर रहे हैं, और आप ऐसा नहीं करते हैं, तो आपके आवेदन कनेक्शन को मारने के लिए किसी बिंदु पर आपके पास डीबीए की संभावना नहीं होगी। stmt.close()con.close() पर अनावश्यक है यदि आप एक ही कनेक्शन पर एकाधिक स्टेटमेंट्स का उपयोग नहीं कर रहे हैं, तो con.close()

संबंधित मुद्दे