我正在开发一个从本地数据库中提取数据的简单应用程序。当我使用字符串进行SQL查询时,下面的代码工作正常,但我不能让它与PreparedStatement一起使用。我已经回顾了这里发布的类似问题,但大多数都是由这样做的,preparedStmt.executeQuery(查询);而不是这个preparedStmt.executeQuery();这是代码,
private final String POSTTITLE= "posttitle"; // DB Column name
private final String POSTCONTENT= "content"; // DB Column name
public String getDbContent(){
try{
String query ="select values(?, ?) from blog";
PreparedStatement preparedStmt = this.connect.prepareStatement(query);
preparedStmt.setString (1,POSTTITLE);
preparedStmt.setString (2,POSTCONTENT);
ResultSet rs = preparedStmt.executeQuery();
rs.next();
return(rs.getString(this.POSTCONTENT)); //Will replace with loop to get all content
} catch(Exception e) {
System.err.println("Error Reading database!");
System.err.println(e);
return("Error: "+e);
}
}
这是我得到的错误: 您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以获得正确的语法,以便在博客'' posttitle'内容')附近使用。在第1行
答案 0 :(得分:2)
预准备语句中的参数用于值 - 您尝试使用它们来选择字段。他们只是不这样做。
在这个非常具体的实例中,您需要使SQL动态化。但是,您需要确保允许指定列的任何代码都受到严格限制,以避免SQL注入攻击。 (例如,您可以使用包含列的枚举或允许值的白名单。)
答案 1 :(得分:0)
尝试连接选择查询:
String query ="select "+POSTTITLE+","+POSTCONTENT+" from blog";
请记住,准备好的语句是针对值而不是查询参数,对于它们我们只使用连接。
答案 2 :(得分:0)
试试这个:
String query ="select POSTTITLE, POSTCONTENT from blog";
PreparedStatement preparedStmt = this.connect.prepareStatement(query);
ResultSet rs = preparedStmt.executeQuery();
rs.next();
无需使用字段名称作为参数。