我有这个选择查询。我如何知道查询是否在数据库中找到了匹配项?
try{
PreparedStatement fetchPlayers = conn.prepareStatement("SELECT * FROM players WHERE P_Name='" + player + "'");
fetchPlayers.executeQuery();
}catch(Exception e){}
我尝试过这样做,但即使我输入了数据库中没有的内容,它也总是返回true。
if(fetchPlayers.execute()==true){
System.out.println("True");
}
答案 0 :(得分:6)
PreparedStatement.execute()返回
如果第一个结果是ResultSet对象,则为true;如果第一个结果是更新计数或没有结果
,则返回false
使用executeQuery()代替。您感兴趣的是返回的ResultSet是否有正数。
ResultSet rs = statement.executeQuery(query);
if ( rs.next() ) {
// curser has moved to first result of the ResultSet
// thus here are matches with this query.
}
答案 1 :(得分:4)
首先,您不应该通过字符串连接构造语句,而是使用占位符和setXXX方法。
executeQuery()返回一个ResultSet,这有一些迭代结果的方法。例如,next()方法在没有更多行的情况下返回false。
答案 2 :(得分:1)
您可以检查返回的列数,并从中查看是否大于0:
ResultSet resultSet = statement.executeQuery(query);
ResultSetMetaData metaData = resultSet.getMetaData();
int columncount = metaData.getColumnCount();
if (columncount > 0) {
System.out.println("Match found!");
}
答案 3 :(得分:1)
来自the doc:
返回: 如果第一个结果是ResultSet对象,则为true;否则为false。如果它是一个假的 更新计数或没有结果
你的陈述正在返回一个(尽管是空的)ResultSet
。
您是否尝试过使用if exists?或者至少获取ResultSet
并迭代它,计算条目并确定是否存在任何条目(效率较低,但这可能不是问题)。
(正如Paŭlo所说,你不应该连接SQL字符串,因为这会让你对SQL injection attacks开放。而应该使用PreparedStatement
对象中的参数设置方法
答案 4 :(得分:0)
执行此操作的简单方法可能是:
resultSet.last()
if (resultSet.getRow() < 1){
// process case with no results
}else{
// process case with results
resultSet.beforeFirst();
}
不确定这有多快,但如果速度不是对象...... `