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

时间:2010-08-17 23:21:21

标签: java mysql connection-string database-connection

我是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做一些事情时调用一个新对象吗?

此致

比利

4 个答案:

答案 0 :(得分:6)

我会说你的代码是许多最差实践的一个例子。让我数一下方法:

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

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

    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.Connectionjava.sql.Connection之间会出现名称冲突。您需要指定要使用java.sql.Connection的完全限定类名,否则假定为lokate.Connection

指定完全限定的类名,如下所示:

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

或者,将您的Connection课程重命名为其他内容,您将不会遇到此命名冲突。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

  

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

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

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