我有一个像下面这样的java方法:
public String qE (String query, String selector) throws QSLException, IOException{
//I get my sqlQuery from properties
String sqlQuery = properties.getPRoperty(query);
//sqlQuery = SELECT count(?) FROM employees WHERE ? is not null
PreparedStatement ps = conn.preparedStatement(sqlQuery);
ps.setFetchSize(100);
ps.setString(1,selector);
ps.setString(2,selector);
ResultSet rs = ps.executeQuery();
String rs = "";
while(rs.next()){
queryValue = rs.getString(1);
}
return queryValue;
}
当我用参数运行它时 qe(employees,second_name) 然后应执行此查询:
SELECT count(second_name)
FROM employees
WHERE second_name is not null
问题是没有员工有第二个名字,我应该得到0,整个方法应该返回0,但我总是得到大于零的不同数字。
有谁可以告诉我为什么这不会返回0但总是不同的数字,例如2399?
答案 0 :(得分:8)
?
代表值而非对象名称,因此相当于使用
SELECT count('second_name')
FROM employees
WHERE 'second_name' is not null
始终为真且始终计算。换句话说,您的查询会计算表employees
中的所有行。
您不能使用参数来参数化对象名称。如果您确实需要动态执行此操作,则需要动态构造查询(通过在查询字符串中连接名称)。如果你这样做,请务必保护自己免受SQL注入(例如,通过在白名单中检查名称或明确地与数据库元数据进行比较)。