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在下面的代码中包含方法。基本上我需要这个,因为我有多种类型的 SQL 对数据库的调用,并且将其更改为这种方式将很容易维护,因为凭据/主机将仅在一个文件上。

我相信改变应该是我有评论的地方

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

我知道如何在 Perl 上做到这一点,但我没有任何 Java 实践。

4

5 回答 5

3

制定你的connect()方法static,然后你可以这样称呼它

Connection con = PgConnect.connect();

还要编辑你的方法 connect to Connection,因为你需要返回Connectionnot 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;
    }

还有另一种更清洁的方法。这是我旧项目的示例。

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,所以我不知道您如何在其他 IDE 中执行此操作,但是当您按下时ALT+Insert,将显示一个小菜单,您可以选择“使用数据库...”并只需单击几下即可自动创建你Connection的数据库。

于 2012-06-20T17:46:12.153 回答
3

隐藏凭据的一种方法是创建connect一个静态函数返回Connection,如下所示:

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;
}
于 2012-06-20T17:46:27.410 回答
1

您可以使用上面指定的方法,而不是 returnvoid返回连接:

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...
        }
    }
}
于 2012-06-20T17:48:11.607 回答
1

据我了解,您想从into调用该connect()方法,以便您可以使用该对象。PgConnect.javaReturnResults.javaConnection

你可以做两件事——

  1. 您可以扩展PgConnect.javain ReturnResults.javalikepublic class ReturnResults extends PgConnect然后使用该connect方法。
  2. 您可以使您的PgConnect班级静态并像PgConnect.connect()ReturnResults班级中一样使用它。
于 2012-06-20T17:50:04.540 回答
0

你是说要拉出一个连接到它自己的函数中,这样每次需要进行sql调用时都可以调用它?如果我不在基地,这似乎就是你要问的对不起......

但是,如果这是您要问的,那么您就在正确的轨道上,因为这是要做的标准事情...

你为什么不试试这个,我试图不仅给你一个答案,而且给你一些最佳实践,让你开始,让你的生活更轻松。....(我假设 PGConnect.java 位于同一个包中,如果没有相应地解析您的地址。SO 上的许多其他帖子都会描述这一点。它是 java/大多数编程语言中的基本内容。)更新您的第一个文件看起来像这样,请注意我正在使函数获取静态连接,并且我正在将异常传递给调用方法,这样我们就可以逐个处理这些异常。我什至更喜欢将它们完全从数据层传递出去,这样您就可以在应用程序中获得良好的错误报告,但这在很大程度上取决于您设计该应用程序的方式。

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 中输入 SQL 是非常令人沮丧的,我假设您最终会这样做,因为几乎每个应用程序都会在某个地方这样做。请参阅http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html使用准备好的语句。我重写了您的 SQL 以使用准备好的语句。

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()finally 块中。总是总是这样做。如果您最终在 try 块中抛出异常,这将确保它被调用。如果你不这样做,你的连接会保持很长时间,这会对性能产生非常负面的影响。如果您在企业环境中工作,并且您不这样做,那么您可能会在某些时候遇到 DBA 的问题,因为您不会终止您的应用程序连接。如果您不在同一个连接上使用多个语句,则它是多余的,因此在调用时没有理由调用stmt.close()con.close()con.close()

于 2012-06-20T18:26:14.867 回答