当前位置: 首页 > 面试题库 >

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

沈子昂
2023-03-14
问题内容

我是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 .....不可比拟的类型。

有人可以帮忙吗?

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

问候,

比利


问题答案:

我想说您的代码是许多最差做法的示例。让我来计算一下:

  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<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;
    }
}


 类似资料:
  • 我有一些集成测试,为此我使用Testcontainers。但我突然意识到,当我的应用程序数据库docker容器关闭时,所有其他测试(不包括使用Testcontainers的集成测试)都失败了(甚至是Spring Boot Initializer生成的

  • 在使用Node.js之前,我只使用过PHP。在使用MYSQL时,我能够在PHP中做的是,我可以将database.PHP文件包含在我想要执行查询的文件中。 在Node.js中似乎不是这样。这是我的database.js文件 那么我需要在我的文件login.js中这样做 但是,当我尝试运行时,我发现db.query不是一个函数。 这是为什么?不应该更复杂还是应该?

  • 我正在上Java课程的第三周。我正在做一个下星期要交的课堂作业。使用控制台作为输出,我可以毫无问题地完成分配,这是可以接受的。然而,教授也建议我们研究JTextArea,并考虑将其用于我们的程序输出。 我从一个教程中找到了一些代码,并且能够至少得到一个文本块来显示我要显示的第一行文本。但是在我编写实际程序时,我需要随着程序的进展继续向文本块添加额外的行。

  • 我是firestore数据库的新手,我已经在android studio中开发了一个应用程序来访问firestore数据库中的数据。我的应用程序有两种类型的用户类别1。管理2。用户我已经使用短信服务提供商的API实现了移动号码认证逻辑。我没有使用谷歌的firebase认证。我不能理解如何编写firestore数据库的规则。 admin-->可以读写所有集合 用户-->可以读取所有集合,但只能写入少

  • 本文向大家介绍C#连接数据库和更新数据库的方法,包括了C#连接数据库和更新数据库的方法的使用技巧和注意事项,需要的朋友参考一下 对数据库的操作总体可以分为两类:查询(select)和更新(insert,delete,update)。为什么这样来分呢?仔细看看两类的区别,select只是从数据库中将数据拿出来使用,而其余三者都会对数据库的物理数据进行修改。这篇文章将接着阐述更新数据。 更新数据库信息

  • {photos:[],product:[],report_date:null,report_sum:null,check_number:“”,qr_img:null,qr_link:“”} 旧表单-数据表单: ------WebKitFormBoundaryEFKGXHEAEJV3FGL7内容-配置:表单-数据;name=“report_date”2018-08-17t12:00:00.000z-