SQLException while 运行 查询 JDBC

SQLException while running a query with JDBC

在我的程序中,我使用 JDBC 执行了一些 SQL 查询。当我 运行 这个特定查询的程序时,我得到以下错误:

SQL异常:线程 "main" java.sql.SQLException:at TransformData.main(TransformData.java:213)

中的异常

这是这部分代码:

    try
    {
        dbcon = DriverManager.getConnection(url,"username","password");
        stmt = dbcon.createStatement();
        stmt1 = dbcon.createStatement();
        stmt13 = dbcon.createStatement();
        stmt14 = dbcon.createStatement();
        String sql1 = "SELECT DISTINCT payer_id FROM transactions ORDER BY payer_id";
        rs1 = stmt1.executeQuery(sql1);

        while (rs1.next())
        {
            Integer payer_id = rs1.getInt("payer_id");
            payer_ids.add(payer_id);
        }
        rs1.close();
        stmt1.close();
        for(int i = 0; i < payer_ids.size(); i++)
        {
            String sql13 = "SELECT COUNT(*)  AS counter, isCOrporate FROM transformed_table WHERE payer_id = "+payer_ids.get(i)+" ";
            rs5 = stmt13.executeQuery(sql13);
            while(rs5.next())
            {
                int counter = rs5.getInt("counter");
                int isCorporate = rs5.getInt("isCorporate");
                if ((counter - payer_ids.get(i).intValue() - isCorporate) < 1)
                {
                    String sql14 = "DELETE FROM transformed_table WHERE payer_id = "+payer_ids.get(i)+" ";
                    stmt14.executeUpdate(sql14);
                }
            }
        }
        rs5.close();
        stmt13.close();
        stmt14.close();

        dbcon.close();
     }
     catch(SQLException e)
     {
         System.out.print("SQLException: ");
                        throw new SQLException(errorMessages);

     }

第 213 行是这一行:throw new SQLException(errorMessages); in catch。 我试图找到可能引发此异常的原因。有人可以帮忙吗?

这段代码有很多问题,但这里有一个中肯的提示:你的 catch 块是错误的。这样写:

catch(SQLException e) {
    e.printStackTrace();
}

您的方式耗尽了堆栈跟踪中的所有有用信息。你不能调试你做错了什么。

进行更改,重新运行代码,并阅读堆栈跟踪。它会告诉您真正的问题是什么。

要更正的地方太多了:

  1. 资源未正确关闭。这些应该在 finally 块中的单个 try/catch 块中完成。
  2. 写得不好SQL。使用 JOIN 可以更有效地完成 DELETE。
  3. 分解不良。这里隐藏着 2 或 3 个方法。
  4. 没有事务管理器;没有酸。
  5. 没有连接池;应该传递给这个方法而不是在范围内实例化。
  6. 应该使用 PreparedStatement 和绑定而不是连接 String

我不确定,但您似乎有三个 SQL 查询:

  1. SELECT 所有付款人 ID
  2. 获取 COUNT 个付款人 ID
  3. 删除您从 SELECT 获得的列表中的所有付款人 ID。

我没看错吗?如果是,为什么不像这样在一次查询中完成呢?

DELETE 
FROM transformed_table 
WHERE payer_id IN (SELECT DISTINCT payer_id FROM transactions)