如何将 ResultSet 对象转换为 Comparable 对象

How to cast A ResultSet object in to Comparable object

我正在编写通用 Java 代码,我想将整数添加到将存储在 mysql 数据库中的最小堆中。为此,我写了下面的代码,

public void addElement(Comparable value) {

    sql = "INSERT INTO testHeap VALUES("+size+","+(int)value+ ") ";
    try {
        stmt.executeUpdate(sql);
        size++;
    } catch (SQLException ex) {
        Logger.getLogger(HeapMySql.class.getName()).log(Level.SEVERE, null, ex);
    }

    if(size == 0) throw new IllegalStateException("Shape error");
int index = size - 1;  
while(size != 0) {

        sql = "SELECT value FROM testHeap WHERE indexnum ="+index;
        T val;
        try {
            val = (T)stmt.executeQuery(sql);
                if(myParent(index).compareTo(val) <= 0) break; 

                    swap(parent(index), index); 
                    index = parent(index);
        } catch (SQLException ex) {
            Logger.getLogger(HeapMySql.class.getName()).log(Level.SEVERE, null, ex);
        }

}
}

这个 returns 下面的运行时异常

线程 "main" java.lang.ClassCastException 中的异常:com.mysql.jdbc.JDBC4ResultSet 无法转换为 java.lang.Comparable 在 Lab03.HeapMySql.addElement(HeapMySql.java:140)

我想知道如何正确地做到这一点 "val = (T)stmt.executeQuery(sql)" :)

ResultSet 将所有结果作为数组中的对象,而不是结果本身!您必须将每一个都转换为它的类型。此外,ResultSet 也可用于轻松更改回数据库。所以你根本没有得到 jdbc 的概念 ^^ 你应该阅读一些关于如何使用 jdbc 的教程。 如需进一步帮助,请使您的问题更容易理解。我们无法知道哪一行是 140(来自错误),我假设:

if(myParent(index).compareTo(val) <= 0) break;

您需要在结果集中指定一列(即使只有一个)

val = (T)new Integer(stmt.executeQuery(sql).getInt(1));

正如您在下面评论的那样,您的结果集中需要一个活动行。

您还需要在完成后将其关闭,否则您将 运行 失去数据库游标。读完最后一行(使用 rs.next)会自动关闭它,所以我使用 "while" 而不是 "if".

ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
    val = (T)new Integer(rs.getInt(1)))
}