我对编程相当陌生,我有一个问题,从使用jdbc的SQL查询获得特定的值。我想从'session_id'列的最后一行获得值,我知道有13行(其中int 'position'被初始化),我希望'resultSet.getInt(13)'将从列的最后一行获得值(这是一个int)。
try {
String sql = "SELECT session_id FROM log_table ORDER BY session_id DESC";
stmt = conn.createStatement();
ResultSet resultSet = stmt.executeQuery(sql);
while (resultSet.next()) {
if (resultSet.last()) {
int position = resultSet.getRow();
latestSessionID = resultSet.getInt(position);
}
System.out.println("Latest session_id : "+latestSessionID);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
但是代码返回以下异常
Connected to driver // my own trace
Connected to database // my own trace
java.sql.SQLException: Column Index out of range, 13 > 1.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928)
at com.mysql.jdbc.ResultSetImpl.checkColumnBounds(ResultSetImpl.java:826)
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2710)
at org.Database.JDBC.checkDatabase(JDBC.java:113)
at org.Database.JDBC.main(JDBC.java:166)
我已经尝试了所有通常的选项,没有问题以前问堆栈溢出可以回答这个问题。有人知道最好的方法吗?谢谢!
由于您获得的是最后一条记录作为最新会话id,因此我假设您的订单按条件应该是ORDER BY SESSION_ID ASC
而不是ORDER BY SESSION_ID DESC
使用如下:
String sql = "SELECT session_id FROM log_table ORDER BY session_id asc";
int position = 0; // Number of nth Position
while (resultSet.next()) {
if (resultSet.last())
{
position = resultSet.getRow();
latestSessionID = resultSet.getInt(1);
//
latestSessionID = resultSet.getInt("SESSION_ID");
System.out.println("Number of sessions = " + position + ", Session ID is : " + latestSessionID);
}
指出:
resultSet.getInt(ColumnIndex)
取从1开始的columnIndex,其中查询的第一个字段为1,第二个字段为2,依此类推.....因为你只想要1条记录,你也可以改变你的查询如下:
-- For Oracle SELECT SESSION_ID FROM LOG_TABLE WHERE ROWNUM=1 ORDER BY SESSION_ID DESC; -- For other DBs based on DB, SELECT TOP 1 SESSION_ID FROM LOG_TABLE ORDER BY SESSION_ID DESC; SELECT SESSION_ID FROM LOG_TABLE ORDER BY SESSION_ID DESC LIMIT 1;
您的查询只返回一列session_id。要获取第一列,索引为1。
resultSet.getInt(1);
您可能感到困惑,因为您的查询返回了许多列。列和行不共享索引。- 第一列将始终是索引1,无论你"指向"哪一行。
- 行总是你当前"指向"的行。
如果您曾经在Java中使用过扫描器,您可能遇到过类似的"指向"语句。基本上,ResultSet"跟踪"你所在的行。您调用的任何方法都将在该行上执行,直到您最终将该行向前移动。
有关更多信息,我建议您阅读Javadoc的ResultSet。
对于latestSessionID = resultSet.getInt(position);
这行,您试图调用列13,因为最后一行是13。您需要做的是尝试获取列1,因为您的查询:SELECT session_id FROM log_table ORDER BY session_id DESC
只将一列带到一方。
你也可以检查这个链接,它一步一步地解释一切:http://tutorials.jenkov.com/jdbc/resultset.html
您的resultset
将包含一列,因为您的查询SELECT session_id FROM log_table ORDER BY session_id DESC
包含一列。
由于您期望的列在查询中,那么它可以通过列名或它所在的索引位置在resultset
中调用。
要从查询的resultset
中获得session_id
,请使用resultSet.getInt(1)
或resultSet.getInt("session_id")
这是修改后的代码,还注意finally块。当使用核心JDBC时,您需要确保JDBC对象是关闭的,否则您将面临内存泄漏的风险。
ResultSet resultSet = null;
try {
String sql = "SELECT session_id FROM log_table ORDER BY session_id DESC";
stmt = conn.createStatement();
resultSet = stmt.executeQuery(sql);
while (resultSet.next()) {
if (resultSet.last()) {
latestSessionID = resultSet.getInt("session_id");
}
System.out.println("Latest session_id : "+latestSessionID);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
try {resultSet.close();} catch(Exception e) { } //Suppress Exception
try {conn.close();} catch(Exception e) { }
try {stmt.close();} catch(Exception e) { }
}