避免跳过一行by ResultSet的next()方法

时间:2017-05-20 16:14:59

标签: java mysql database jdbc resultset

这是一个简单的代码打印数据库中的一些行。但是当我执行此操作时,屏幕上没有任何内容。我认为问题是rs.next()方法正在跳过一行。那么如何避免这种情况或重置rs.next()方法的位置?

 String searchword = Searchtf.getText();
 try {
        Class.forName("com.mysql.jdbc.Driver");

        java.sql.Connection con = DriverManager.getConnection(url, db_username, db_password);

        java.sql.Statement stat = con.createStatement();

        String searchQuery = "SELECT * FROM user WHERE Name LIKE '" + searchword + "' ";

java.sql.ResultSet rs = stat.executeQuery(searchQuery);

        if (rs.next()) {
            while (rs.next()) {
                System.out.print(rs.getString("idUser") + " ,");
                System.out.print(rs.getString("Name") + " ,");
                System.out.print(rs.getString("Email") + " ,");
                System.out.println(rs.getString("country") + " .");
            }
        } else {
            JOptionPane.showMessageDialog(null, "Not Found");
        }
  } catch (Exception ex) {
        ex.printStackTrace();
    }

6 个答案:

答案 0 :(得分:4)

首先,停止构建SQL - 使用参数化SQL和PreparedStatement。您当前的代码容易受到SQL注入攻击。

基本上,请勿连续两次致电rs.next()if中的while然后while} ...您可以通过转换{{1循环到do/while循环:

if (rs.next()) {
    do {
        System.out.print(rs.getString("idUser") + " ,");
        System.out.print(rs.getString("Name") + " ,");
        System.out.print(rs.getString("Email") + " ,");
        System.out.println(rs.getString("country") + " .");
    } while (rs.next());
}

只是拥有while循环,并带有一个单独的变量来检测您已经看到某些结果:

bool anyResults = false;
while (rs.next()) {
    anyResults = true;
    System.out.print(rs.getString("idUser") + " ,");
    System.out.print(rs.getString("Name") + " ,");
    System.out.print(rs.getString("Email") + " ,");
    System.out.println(rs.getString("country") + " .");
}
if (!anyResults) {
    JOptionPane.showMessageDialog(null, "Not Found");
}

(另外,你应该使用try-with-resources来关闭你的ResultSet等,只是将堆栈跟踪打印到stdout几乎不是处理异常的合适方法......)

答案 1 :(得分:1)

The API docs for ResultSet解释next()方法:

  

将光标从其当前位置向前移动一行。一种   ResultSet游标最初位于第一行之前;的   首先调用该方法,然后将第一行作为当前行;的   第二次调用使第二行成为当前行,依此类推。

每次调用next()方法时,您都将光标移动到下一行。 这在您的代码中发生了两次(两次):

if (rs.next()) {
            while (rs.next()) { 

避免该问题的一种方法是使用beforeFirst()方法。 According to the API

  

将光标移动到此ResultSet对象的前面,就在   第一行。如果结果集不包含任何内容,则此方法无效   行。

然后,每次在代码“ rs.next()”中的某处使用时,都将光标移动一个位置(移至下一行),但是如果多次使用rs.next()之后,则需要从该位置开始读取第一行可以简单地使用rs.beforeFirst(),当您下次调用rs.next()时,光标将从结果集的开头开始。

此外,您无需在代码中使用if语句:

if (rs.next()) {

因为使用的时间就足够了。

答案 2 :(得分:0)

不需要使用:

 if (rs.next()) {

虽然时间已经足够,但结果却是两次。 相反,你可以使用:

boolean b = false;
while (rs.next()) {
   b = true;
   ...
}

if(!b) {
  JOptionPane.showMessageDialog(null, "Not Found");
}

您必须使用PreparedStatement,以避免任何SQL注入或语法错误。

答案 3 :(得分:0)

rs.next()会在if中增加光标,所以如果结果集只有一行查询返回,那么while将再次移动光标,没有数据会被打印。使用do..while而是循环。

if (rs.next()) {
            do {
                System.out.print(rs.getString("idUser") + " ,");
                System.out.print(rs.getString("Name") + " ,");
                System.out.print(rs.getString("Email") + " ,");
                System.out.println(rs.getString("country") + " .");
            }while (rs.next());
        } 

答案 4 :(得分:0)

感谢您的每一个答案。我发现放rs.relative(-1)也可以。但上面的答案编码很好,比我的好。所以,谢谢大家。我是编程的新手,我会在编码中考虑你的所有建议。感谢

if (rs.next()) {
     rs.relative(-1);
        while (rs.next()) {
            System.out.print(rs.getString("idUser") + " ,");
            System.out.print(rs.getString("Name") + " ,");
            System.out.print(rs.getString("Email") + " ,");
            System.out.println(rs.getString("country") + " .");
        }
 }

答案 5 :(得分:-2)

嘿它正在跳过行,因为你在if子句中执行rs.next()然后再执行while。所以while的第一次迭代实际上是第二行。如果(rs.first())

,则应该在if子句中写出最佳选项