如果存在具有给定条件的行,如何从java检查数据库?

时间:2011-08-05 15:08:27

标签: java database methods

我有表格VIDEO (VideoID int Primary Key, Address Varchar(100)),我想搜索表格以查看是否有包含指定地址的视频。但我不确定这段代码是否运行良好,如果可以做得更好。 这是我的代码:

public boolean checkIfVideoExist(String address) throws SQLException {
    int count = 0;
    Statement stmt = connection.createStatement();
    ResultSet rset = stmt
            .executeQuery("SELECT Count(VideoID) from VIDEO WHERE Address='"
                    + address + "'");
    if (rset.next())
        count = rset.getInt(1);
    if (count == 0)
        return false;
    else
        return true;
}

4 个答案:

答案 0 :(得分:3)

代码很好,除了你在查询中嵌入字符串的方式。如果address包含引号字符,则查询将变为无效。这只是问题的一小部分。这样做会打开SQL注入攻击的大门,恶意用户可以输入一个完全改变查询含义的地址。

始终使用预准备语句绑定参数:

PreparedStatement stmt = connection.prepareStatement("SELECT Count(VideoID) from VIDEO WHERE Address=?");
stmt.setString(1, address); // proper escaping is done for you by the JDBC driver
ResultSet rset = stmt.executeQuery();

此外,您应该使用finally块来关闭结果集和语句。

答案 1 :(得分:3)

确保您在列ADDRESS上设置了索引。然后你的查询应该快速运行。

最好使用预准备语句将地址值传递给查询。你应该关闭结果集和声明。

并且

if (count == 0)
  return false;
else
  return true;
看起来有点奇怪。

public boolean checkIfVideoExist(String address) throws SQLException {
  int count = 0;
  PreparedStatement stmt = null;
  ResultSet rset = null;
  try {
    stmt = connection.prepareStatement(
        "SELECT Count(VideoID) from VIDEO WHERE Address=?");
    stmt.setString(1, address);
    rset = stmt.executeQuery();
    if (rset.next())
      count = rset.getInt(1);
    return count > 0;
  } finally {
    if(rset != null) {
      try {
        rset.close();
      } catch(SQLException e) {
        e.printStackTrace();
      }
    }        
    if(stmt != null) {
      try {
        stmt.close();
      } catch(SQLException e) {
        e.printStackTrace();
      }
    }        
  }    
}

答案 2 :(得分:2)

您的代码容易受到SQL Injection的攻击,它应该使用a prepared statement而不是通过字符串连接来构建SQL查询。

除此之外,看起来还不错。

答案 3 :(得分:0)

ResultSet rset = stmt.executeQuery("SELECT * from VIDEO WHERE Address='" + address + "'");
return rset.next();

然后至少有一个匹配的记录,你就完成了。不需要聚合函数count()....