Java新手需要数据库连接方面的帮助

我是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的无法比较的类型…..

有人可以帮忙吗?

另外,最好将连接放在这样的类中,然后每次我想用db做一些事情时调用一个新对象?

问候,

比利

我要说你的代码是许多最差实践的一个例子。 让我来计算一下:

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

你走错了路。 反思它。

我想你会发现这段代码更有帮助。

 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(ResultSet rs) throws SQLException { List> results = new ArrayList>(); try { if (rs != null) { ResultSetMetaData meta = rs.getMetaData(); int numColumns = meta.getColumnCount(); while (rs.next()) { Map row = new HashMap(); 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; } } 

您的问题是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类重命名为其他类,您将不会遇到此命名冲突。

Connectionjava.sql包中的现有类型,这是DriverManager.getConnection返回的类型。 您已将您的类命名为Connection ,因此这会引起混淆。 最简单的方法是将类重命名为其他内容并添加import java.sql.Connection; 在顶部。

另外,最好将连接放在这样的类中,然后每次我想用db做一些事情时调用一个新对象?

我认为最好的做法是使用现有的解决方案解决这个问题,这样你就可以避免重新发明轮子并专注于使你的问题独特的原因。

如果您正在编写服务器应用程序(不清楚是否存在),那么我还会考虑使用数据库连接池。 动态创建新的数据库连接效率不高,无法很好地扩展。 您可以在我写的这篇文章中读到有关数据库连接问题的文章 。