如何将 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)))
}
我正在编写通用 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)))
}