Java 如果JDBC的结果为空,如何返回false
在我的代码中,我需要当查询结果为空时,它应该返回Java 如果JDBC的结果为空,如何返回false,java,mysql,jdbc,Java,Mysql,Jdbc,在我的代码中,我需要当查询结果为空时,它应该返回false 我的代码: public boolean user_bookValidationQuery(String userID, String bookID) { Connection con; PreparedStatement ps; String query = " select * from borrowed where userID=? and bookID=? "; try {
false
我的代码:
public boolean user_bookValidationQuery(String userID, String bookID) {
Connection con;
PreparedStatement ps;
String query = " select * from borrowed where userID=? and bookID=? ";
try {
con = DriverManager.getConnection(...);
ps = con.prepareStatement(query);
ps.setString(1, userID);
ps.setString(2, bookID);
if (ps.execute()) {
System.out.println("You can do it! , id DB");
return true;
} else return false;
} catch (SQLException sqle) {
sqle.printStackTrace();
return false;
}
}
现在,对于userID
和bookID
的给定值,我在mysql控制台中尝试,看到它的结果是空的,但在我的代码中它仍然返回true
为什么这里不为false?空结果并不意味着发生了SQL异常。您需要检查结果是否为空,然后返回false。空结果并不意味着发生了SQL异常。您需要检查结果是否为空,然后返回false。您需要检查语句的结果
ResultSet rs= ps.execute();
rs.isBeforeFirst()
如果结果集中没有行,将返回false
因此,您的代码应该如下所示:
try {
con = DriverManager.getConnection(...);
ps = con.prepareStatement(query);
ps.setString(1, userID);
ps.setString(2, bookID);
ResultSet rs= ps.execute();
if (!rs.isBeforeFirst() ) {
System.out.println("empty");
return false;
}else {
System.out.println("with data");
return true;
}
} catch (SQLException sqle) {
sqle.printStackTrace();
return false;
}
您需要检查语句的结果
ResultSet rs= ps.execute();
rs.isBeforeFirst()
如果结果集中没有行,将返回false
因此,您的代码应该如下所示:
try {
con = DriverManager.getConnection(...);
ps = con.prepareStatement(query);
ps.setString(1, userID);
ps.setString(2, bookID);
ResultSet rs= ps.execute();
if (!rs.isBeforeFirst() ) {
System.out.println("empty");
return false;
}else {
System.out.println("with data");
return true;
}
} catch (SQLException sqle) {
sqle.printStackTrace();
return false;
}
为什么这里不假
根据javadoc:
返回:true
如果第一个结果是ResultSet
对象false
如果第一个结果是更新计数或没有结果
在您的情况下,第一个结果将是ResultSet
对象。空的ResultSet
仍然是ResultSet
在这种情况下(例如,当SQL是“选择”时),解决方案是使用
executeQuery
并使用`ResultSet.isBeforeFirst()测试ResultSet
是否为空
或者(例如,当SQL可能返回或不返回ResultSet
)时,您可以测试query()
的结果,然后调用getResultSet()
并测试其是否为空
为什么这里不假
根据javadoc:
返回:true
如果第一个结果是ResultSet
对象false
如果第一个结果是更新计数或没有结果
在您的情况下,第一个结果将是ResultSet
对象。空的ResultSet
仍然是ResultSet
在这种情况下(例如,当SQL是“选择”时),解决方案是使用
executeQuery
并使用`ResultSet.isBeforeFirst()测试ResultSet
是否为空
或者(例如,当SQL可能返回或可能不返回
ResultSet
)时,您可以测试query()
的结果,然后调用getResultSet()
并测试它是否为空。您使用了错误的条件语句,即使结果为空,查询也将执行,并且ps.execute()
将返回true
您使用了错误的条件语句,即使结果为空,查询也将执行,并且ps.execute()
将返回true
因此,无论您是否期望结果,对于select语句,execute()总是返回true javadoc for execute:如果第一个结果是ResultSet对象,则为true;如果第一个结果是更新计数或没有结果,则为false
因此,无论您是否期望结果,对于select语句,execute()总是返回true 的返回值并不表示您认为它的含义:
返回:
true
如果第一个结果是ResultSet
对象false
如果第一个结果是更新计数或没有结果
SELECT
语句将始终生成一个ResultSet
(即使结果中没有行)。相反,你应该
使用从中获得的结果集
检查的值以查看是否至少有一个结果
的返回值并不表示您认为它的含义:
返回:
true
如果第一个结果是ResultSet
对象false
如果第一个结果是更新计数或没有结果
SELECT
语句将始终生成一个ResultSet
(即使结果中没有行)。相反,你应该
使用从中获得的结果集
检查的值以查看是否至少有一个结果
检查从execute()
返回的结果集的最简单方法是空的
检查从execute()
返回的结果集的最简单方法是空的
PreparedStatement.execute()的javadoc对返回值有什么看法?PreparedStatement.execute()的javadoc对返回值有什么看法?考虑到isbeforeforefirst()
对于TYPE_uForward
ResultSet是可选的,这不是最好的检查方法。仅检查对next()
的第一次调用是否返回true是检查是否有结果的唯一保证方法。鉴于isBeforeFirst()
对于TYPE\u FORWARD\u only
resultset是可选的,这不是检查的最佳方法。仅检查对next()
的第一次调用是否返回true是检查是否有结果的唯一保证方法。鉴于isBeforeFirst()
对于TYPE\u FORWARD\u only
resultset是可选的,这不是检查的最佳方法。仅检查对next()
的第一次调用是否返回true是检查是否有结果的唯一保证方法。鉴于isBeforeFirst()
对于TYPE\u FORWARD\u only
resultset是可选的,这不是检查的最佳方法。仅检查对next()
的第一次调用是否返回true是检查是否有结果的唯一保证方法。