Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ResultSet的next()方法避免跳过行_Java_Mysql_Database_Jdbc_Resultset - Fatal编程技术网

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

Java ResultSet的next()方法避免跳过行,java,mysql,database,jdbc,resultset,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.getConnec

这是一个从数据库打印一些行的简单代码。但当我执行此操作时,屏幕上没有打印任何内容。我认为问题在于
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();
    }

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

基本上,不要连续两次调用
rs.next()
(首先在
if
中调用,然后在
while
中调用)。。。通过将
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());
}
或者让
while
循环,用一个单独的变量检测您看到的一些结果:

(此外,您应该使用try with resources关闭您的
结果集
等,仅将堆栈跟踪打印到stdout几乎从来都不是处理异常的合适方式…

无需使用:

 if (rs.next()) {
时间足够了,这将导致两次结果。 相反,您可以使用:

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

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


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

嘿,它跳过了行,因为您在if子句中执行rs.next(),然后在while中再次执行。第一次迭代实际上是第二行。最好的选择是if子句u应该写if(rs.first())

rs。next()
将在
if
中增加光标。因此,如果查询只返回一行,则
将再次移动光标,并且不会打印任何数据。请改用
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());
        } 

谢谢你的回答。我发现放置
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") + " .");
        }
 }
解释next()方法:

将光标从当前位置向前移动一行。A. 结果集光标最初位于第一行之前;这个 对方法next的第一次调用使第一行成为当前行;这个 第二次调用使第二行成为当前行,依此类推

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

避免此问题的一种方法是使用beforeFirst()方法。 :

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

然后,每次在代码“rs.next()”中的某个位置使用时,都会将光标移动一个位置(到下一行),但如果在多次使用rs.next()后,需要从第一行开始读取,则只需使用rs.beforeFirst(),并且在调用下一次rs.next()时,光标将从结果集的开头开始

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

if (rs.next()) {

因为使用while就足够了。

如果没有
if
语句,您将如何处理
else
?这里有一些选项(根据我的答案),但你不认为这是你答案中要处理的问题。OP可以在while中使用布尔值来确定是否有@jonsketright结果,因此在答案中指出这一点。我的观点是,正如你的回答所暗示的那样,他们不能仅仅删除
if
语句。对于只向前的
结果集
,这将失败,如果成功,它仍将跳过第一行,因为对
first()
的调用将紧接着对
next()
的调用。只需确保调用
next
的次数正确,就更简单了-请参阅我的答案以获得两个选项。谢谢您的回答。。我将在未来的代码中使用参数化SQL和PreparedStatement
rs.relative(-1)
也为我工作!我查过了it@Nazeer:否,请修复当前代码。你有一个安全漏洞。说“下次我会做得很好”是不够的。养成保护自己不受SQL注入影响的习惯非常、非常、非常重要,现在就开始是最好的时机了。谢谢。。我对参数化SQL和PreparedStatement不是很了解。我现在就要学习。@Nazeer:很好-这正是我应该采取的态度:)可能重复的
relative(-1)
并不总是有效的,例如,它不适用于
TYPE\u FORWARD\u仅
结果集,这通常是默认值。
if (rs.next()) {
            while (rs.next()) { 
if (rs.next()) {