我有表格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;
}
答案 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()....