【问题标题】:Java newbie needs help in database connectionJava新手在数据库连接方面需要帮助
【发布时间】:2010-08-17 23:21:20
【问题描述】:

我是 Java 新手,甚至是 Java 数据库连接的新手。当我把它放在 Main 类中时,我已经设法创建了一个数据库连接并查询了一个表。现在我已经将它移到了一个名为 Connection 的新类中,但我遇到了错误:

package lokate;

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

public class Connection {

private static Statement stmt = null;
private static ResultSet rs = null;
private static Connection con = null;

public Connection() throws SQLException {
    try {
        Class.forName("com.mysql.jdbc.Driver");
        String connectionUrl = "jdbc:mysql://localhost:3306/Lokate?" +
                               "user=root&password=";
        con = DriverManager.getConnection(connectionUrl);
        stmt = con.createStatement();
        retriveData("SELECT * FROM Users");
        int rowsEffected = 0;
    } catch (SQLException sqlEx) {
        System.out.println("SQL Exception: "+ sqlEx.toString());
    } catch (ClassNotFoundException classEx) {
        System.out.println("Class Not Found Exception: "+ classEx.toString());
    } catch (Exception Ex) {
        System.out.println("Exception: "+ Ex.toString());
    }
}

public static void retriveData(String SQL) throws Exception {
    rs = stmt.executeQuery(SQL);
    while (rs.next()) 
    {
        System.out.println(rs.getString("fname") + " : " + rs.getString("lname"));
    }
}

}

我收到一条错误消息,提示找不到符号。符号:方法 createStatement() 和 con = DriveManager 的无与伦比的类型.....

谁能帮忙?

另外,最好的做法是将连接放在这样的类中,然后每次我想对数据库做某事时调用一个新对象?

问候,

比利

【问题讨论】:

标签: java mysql connection-string database-connection


【解决方案1】:

我会说您的代码是许多最糟糕做法的示例。让我数一数:

  1. 您的 Connection 类是一个糟糕的抽象,除了 java.sql.Connection 之外没有提供任何东西。
  2. 如果您使用您的课程,您将永远无法利用连接池。
  3. 您硬连接您的驱动程序类、您的连接 URL 等。如果不进行编辑和重新编译,您将无法更改它。更好的解决方案是将这些东西外部化。
  4. 在 catch 块中打印错误消息比提供整个堆栈跟踪信息要少得多。
  5. 你的代码伤害了我的眼睛。它不遵循 Sun Java 编码标准。
  6. 您的retrieveData 方法完全没有价值。您将如何处理所有这些打印的报表?将它们加载到数据结构或对象中不是更好吗,以便您的其余代码可以使用该信息?
  7. rowsAffected - “affect”是动词,“effect”是名词。另一个没有任何好处的变量。

你走错了路。重新考虑一下。

我认为您会发现此代码更有帮助。

package persistence;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DatabaseUtils
{
    public static Connection createConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException
    {
        Class.forName(driver);

        if ((username == null) || (password == null) || (username.trim().length() == 0) || (password.trim().length() == 0))
        {
            return DriverManager.getConnection(url);
        }
        else
        {
            return DriverManager.getConnection(url, username, password);
        }
    }

    public static void close(Connection connection)
    {
        try
        {
            if (connection != null)
            {
                connection.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }


    public static void close(Statement st)
    {
        try
        {
            if (st != null)
            {
                st.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public static void close(ResultSet rs)
    {
        try
        {
            if (rs != null)
            {
                rs.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public static void rollback(Connection connection)
    {
        try
        {
            if (connection != null)
            {
                connection.rollback();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public static List<Map<String, Object>> map(ResultSet rs) throws SQLException
    {
        List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();

        try
        {
            if (rs != null)
            {
                ResultSetMetaData meta = rs.getMetaData();
                int numColumns = meta.getColumnCount();
                while (rs.next())
                {
                    Map<String, Object> row = new HashMap<String, Object>();
                    for (int i = 1; i <= numColumns; ++i)
                    {
                        String name = meta.getColumnName(i);
                        Object value = rs.getObject(i);
                        row.put(name, value);
                    }
                    results.add(row);
                }
            }
        }
        finally
        {
            close(rs);
        }

        return results;
    }
}

【讨论】:

  • 感谢您的帮助,如果不是严厉的答复!我发现很难找到有关 java 数据库连接的任何有用材料
  • @Jonesy:duffymo 的观点都非常有效。您提到您是 Java 新手,所以我建议您目前不要太认真(负面地阅读)他的 cmets,尽管他提到的都是您应该在学习路径中采用的最佳实践。跨度>
  • Jonesy,在我看来,您仍然认为您发布的代码很好。不要个人认为 - 除了您发布的代码外,我对您一无所知。我只是认为这是错误的做法,我想澄清一下。
  • 那么为什么在事实发生四年后这件事被否决了?在它被OP接受并四次投票之后?人们真的会四处寻找反对投票的人吗?如果版主能调查一下,我会很高兴的。这是不公平的。
  • 我想它一定是冒犯了问这个问题的人。这是一个正确的答案,也是一个残酷的事实。这是编写数据库类的正确方法。它就像 Java 的 ezSQL(PHP db 类)!
【解决方案2】:

您的问题是DriverManager.getConnection 返回一个java.sql.Connection。由于您的课程也称为 Connection,因此您在 lokate.Connectionjava.sql.Connection 之间遇到了名称冲突。您需要在要使用java.sql.Connection 的地方指定完全限定的类名,否则假定为lokate.Connection

像这样指定完全限定的类名:

java.sql.Connection con = null;
// ....
con = DriverManager.getConnection(connectionUrl);

或者,将您的 Connection 类重命名为其他名称,您将不会遇到这种命名冲突。

【讨论】:

    【解决方案3】:

    Connectionjava.sql 包中的现有类型,这是 DriverManager.getConnection 返回的内容。您也将您的班级命名为Connection,所以这引起了混乱。最简单的方法是将您的类重命名为其他名称并在顶部添加 import java.sql.Connection;

    【讨论】:

    • 你会说我的连接类方法是使用数据库的正确方法吗?
    【解决方案4】:

    另外,最好的做法是将连接放在这样的类中,然后每次我想对数据库做某事时调用一个新对象?

    我认为最佳做法是使用现有解决方案来解决此问题,这样您就可以避免重新发明轮子并专注于使您的问题与众不同的地方。

    如果您正在编写服务器应用程序(不清楚您是否是),那么我也会考虑使用数据库连接池。即时创建新的数据库连接效率不高,也不能很好地扩展。您可以在this article I wrote a while 后面阅读有关数据库连接问题的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 2011-03-07
      • 1970-01-01
      • 2010-10-06
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多