在ResultSet中使用getter

时间:2012-05-09 17:04:32

标签: java mysql resultset

我正在尝试使用列'customer_id','email','deliverrable'和'create_date'

来编写用于访问表'customer'的java代码

我有

        Connection conn = DriverManager.getConnection(connectionUrl, connectionUser, connectionPassword);
        Statement constat = conn.createStatement();
        String query = "SELECT * FROM customer WHERE customer_id LIKE " + customerId;
        ResultSet rtn = constat.executeQuery(query);
        Customer cust = new Customer(rtn.getInt("customer_id"), rtn.getString("email"),  rtn.getInt("deliverable"), rtn.getString("create_date"));
        conn.close();
        return cust;

我收到错误:

java.sql.SQLException:在开始结果集之前

据我所知,我的错误是在我创建一个新的Customer对象的行中,但我无法弄清楚我做错了什么。谁能给我一些帮助?谢谢!

3 个答案:

答案 0 :(得分:1)

在访问行的数据之前,您必须始终通过调用resultSet.next()(并检查它返回true)转到下一行:

Customer cust = null;
if (rtn.next()) {
    cust = new Customer(rtn.getInt("customer_id"), 
                        rtn.getString("email"), 
                        rtn.getInt("deliverable"), 
                        rtn.getString("create_date"));
}

请注意,您还应该

  • 使用预准备语句而不是字符串连接来避免SQL注入攻击,并且具有更强大的代码
  • 关闭finally块中的连接,语句和结果集,或者如果使用Java 7则使用try-with-resources构造

阅读JDBC tutorial

答案 1 :(得分:0)

您应该致电ResultSet.first()将结果移至第一个位置。结果集是一种编程约定,不会检索查询的整个结果并保留在内存中。因此,它的界面非常低级,您必须通过first()last()next()等方法明确选择行(每个都返回true以检查所请求的行index在集合中)

答案 2 :(得分:0)

您需要添加

rtn.next();

在使用结果集之前。

通常这是以

完成的
while (rtn.next()) {
  <do something with the row>
}