这是一个简单的代码,用于打印数据库中的一些行。但是当我执行此操作时,屏幕上不会打印任何内容。我认为问题是 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 注入(inject)攻击。
基本上,不要连续两次调用 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
循环,用一个单独的变量来检测你已经看到了一些结果:
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 几乎从来都不是处理异常的合适方法...)
关于java - 通过 ResultSet 的 next() 方法避免跳过一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44088163/