我是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做一些事情时调用一个新对象吗?
此致
比利
答案 0 :(得分:6)
我会说你的代码是许多最差实践的一个例子。让我数一下方法:
retrieveData
方法毫无价值。你会对所有这些印刷的陈述做什么?将它们加载到数据结构或对象中是不是更好,因此其余代码可能会使用该信息?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<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;
}
}
答案 1 :(得分:3)
您的问题是DriverManager.getConnection
会返回java.sql.Connection
。由于您的类也称为Connection,因此lokate.Connection
和java.sql.Connection
之间会出现名称冲突。您需要指定要使用java.sql.Connection
的完全限定类名,否则假定为lokate.Connection
。
指定完全限定的类名,如下所示:
java.sql.Connection con = null;
// ....
con = DriverManager.getConnection(connectionUrl);
或者,将您的Connection
课程重命名为其他内容,您将不会遇到此命名冲突。
答案 2 :(得分:1)
Connection
是java.sql
包中的现有类型,它是DriverManager.getConnection
返回的内容。您已将您的班级命名为Connection
,因此这会引起混淆。最简单的方法是将您的课程重命名为其他内容,并在顶部添加import java.sql.Connection;
。
答案 3 :(得分:0)
另外,最好将连接放在类这样的类中,然后每次我想用db做一些事情时调用一个新对象吗?
我认为最好的做法是使用现有的解决方案来解决这个问题,这样就可以避免重新发明轮子并专注于使问题变得独特的原因。
如果您正在编写服务器应用程序(目前尚不清楚是否),那么我还会考虑使用数据库连接池。动态创建新的数据库连接效率不高,无法很好地扩展。您可以在this article I wrote a while中阅读有关数据库连接问题的信息。