这是一个简单的代码打印数据库中的一些行。但是当我执行此操作时,屏幕上没有任何内容。我认为问题是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();
}
答案 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子句中写出最佳选项