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和PreparedStatementrs.relative(-1)
也为我工作!我查过了it@Nazeer:否,请修复当前代码。你有一个安全漏洞。说“下次我会做得很好”是不够的。养成保护自己不受SQL注入影响的习惯非常、非常、非常重要,现在就开始是最好的时机了。谢谢。。我对参数化SQL和PreparedStatement不是很了解。我现在就要学习。@Nazeer:很好-这正是我应该采取的态度:)可能重复的relative(-1)
并不总是有效的,例如,它不适用于TYPE\u FORWARD\u仅
结果集,这通常是默认值。
if (rs.next()) {
while (rs.next()) {
if (rs.next()) {