最近刚刚出于安全原因将我在SQL中的语句改为准备语句,这就是我想出的内容。
不幸的是,它会在
上出现找不到错误"SELECT * FROM owner WHERE username = ? AND" + "password = ?;";
整个错误:
找不到符号: symbol:方法prepareStatement(java.lang.String) location:类型为HolidayExchange.DBAccess的变量dbAccess
我意识到它应该是一个准备好的陈述时找到一个字符串,但这就是我总是在例子等中看到它。
我可能正在做一些愚蠢的事情,但解决这个问题的任何帮助都会非常有用!
整个方法:
DBAccess dbAccess = new DBAccess();
String sql = "SELECT * FROM owner WHERE username = '?' AND"+
" password = '?'";
PreparedStatement ps = dbAccess.prepareStatement(sql);
ps.setString(1,u);
ps.setString(2,p);
ResultSet rs = dbAccess.executeQuery2(ps);
User user = new User();
while (rs.next()){
user.setFirstname(rs.getString("firstname"));
user.setSurname(rs.getString("surname"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
rs.close();
dbAccess.close();
if(user.getUsername().length()==0){
return null;
}else{
return user;
}
} catch (Exception e) {
return null;
}
}`
答案 0 :(得分:2)
缺少空间
// becomes ANDpassword in the resulting string:
"SELECT * FROM owner WHERE username = ? AND" + "password = ?;";
应该是
// space added before passsword:
"SELECT * FROM owner WHERE username = ? AND" + " password = ?;";
答案 1 :(得分:0)
在执行查询之前始终记录ps.toString()。这将让程序员知道实际执行了什么查询。
此外,PreparedStatement不是字符串
连接con = null; 的Class.forName( “com.mysql.jdbc.Driver”); con = DriverManager.getConnection(“jdbc:mysql:localhost:3306 / jdbctutorial”,“root”,“root”); PrepareStatement ps = con.prepareStatement(sqlQuery);
答案 2 :(得分:0)
找不到符号:symbol:方法prepareStatement(java.lang.String) location:类型为HolidayExchange.DBAccess的变量dbAccess
此错误消息没有任何内容与格式不正确的SQL相关。这是一个编译时错误。 HolidayExchange.DBAccess类没有名为prepareStatement的方法,该方法将java.lang.String作为参数。
您的SQL在编译时未经过验证(或评估),因此不能成为编译时错误的原因。一旦你进行编译,你可能会发现在删除问号周围的单引号后,你的查询就可以了。
答案 3 :(得分:0)
如果您将导入com.mysq.jdbc.*;
删除并将其更改为
导入java.sql.PreparedStatement;
,反之亦然,因为我认为你正在使用的PreparedStatement方法不适合你要连接的数据库。
答案 4 :(得分:-1)
对于每个问号,请尝试在它们周围加上单引号。
'?'