![](/img/trans.png)
[英]How can I create a new table in my SQLite Database using a param from a Java String variable?
[英]How do I retrieve a row from a SQLite database through Java's jdbc using a string variable?
这应该返回名称等于字符串变量名称的行,但是我得到的只是这个错误
[SQLITE_ERROR] SQL错误或缺少数据库(“战争”附近:语法错误)
在这种情况下,由于我使用的是电影数据库,因此尝试使用“星球大战”作为名称变量。 我究竟做错了什么?
public void selectName(ObservableList<Movies> movieList, String name){
String sql = "SELECT id, name, year FROM movies WHERE name = " + name + " ";
try(Connection conn = this.Connect();
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery(sql)){
while(rs.next()){
movieList.addAll(new Movies(rs.getInt("id"),rs.getString("name"),rs.getInt("year")));
}
}catch(SQLException ex){
System.out.println(ex.getMessage());
}
收到错误的原因是您正在执行[..] where name = Star Wars
,这是无效的。 如果您使用文字查询字符串(该值是固定值而不是用户输入的值),则正确的查询将是[..] where name = 'Star Wars'
。
一种简单的解决方案似乎是将值括在单引号中,但是您永远不应将值连接到查询字符串中(尤其是如果它们是用户输入,则不要这样),因为这会使您容易受到SQL注入的攻击。
相反,您应该使用参数化查询(又称预处理语句)并设置参数值。 这样,驱动程序将以避免潜在的SQL注入风险的方式正确处理参数。
具体来说,您应该执行以下操作:
try (PreparedStatemet select = connection.prepareStatement(
"SELECT id, name, year FROM movies WHERE name = ?")) {
select.setString(1, name);
try (ResultSet rs = select.executeQuery() {
// process result set
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.