【问题标题】:Use of getters in ResultSets在结果集中使用 getter
【发布时间】:2012-05-18 05:51:03
【问题描述】:

我正在尝试编写 java 代码来访问包含列“customer_id”、“email”、“deliverable”和“create_date”的表“customer”

我有

        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: 结果集开始之前

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

【问题讨论】:

    标签: java mysql resultset


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

      您应该调用ResultSet.first() 将结果移动到第一个位置。结果集是一种编程约定,不检索查询的整个结果并保存在内存中。因此,它的接口非常低级,您必须通过first()last()next() 等方法显式选择行(每个都返回true 以检查请求的行索引是否在集合中)

      【讨论】:

        【解决方案3】:

        你需要添加

        rtn.next();
        

        在使用结果集之前。

        通常这样做

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

        【讨论】:

          猜你喜欢
          • 2015-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-30
          • 2018-06-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多