如何使用字符串变量通过 Java 的 jdbc 从 SQLite 数据库检索行?

问题描述 投票:0回答:1

这应该返回名称等于字符串变量名称的行,但是我得到的只是这个错误

[SQLITE_ERROR] SQL 错误或丢失数据库(“Wars”附近:语法错误)

在本例中,我尝试使用“星球大战”作为名称变量,因为我使用的是电影数据库。我做错了什么?

 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());
    }
java sqlite jdbc
1个回答
3
投票

您收到错误的原因是您正在执行无效的

[..] 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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.