我正在编写一个通用的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);
}
}
}
这将在运行时返回以下异常
线程"main"中的异常 java.lang.ClassCastException: com.mysql.jdbc.JDBC4ResultSet 不能强制转换为 java.lang.Comparable at Lab03.HeapMySql.addElement(HeapMySql.java:140)
我想知道如何正确地执行"val = (T)stmt.executeQuery(sql)":)
您需要在结果集中指定一列(即使只有一个列)
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)))
}
结果集将所有结果作为数组中的对象,它不是结果本身!你必须将每一个都转换为它的类型。此外,结果集也可用于对数据库进行简单的更改。所以你根本没有理解 jdbc 的概念^^你应该阅读一些教程,一般来说如何使用 jdbc。如需进一步帮助,请使您的问题更好地理解。我们无法知道哪一行是 140(从错误中),我假设:
if(myParent(index).compareTo(val) <= 0) break;