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

如何使用字符串变量通过Java的jdbc从SQLite数据库检索行?,java,sqlite,jdbc,Java,Sqlite,Jdbc,这应该返回name等于字符串变量名的行,但是我得到的只是这个错误 [SQLITE_ERROR]SQL错误或Wars附近缺少数据库:语法错误 在本例中,我尝试使用星球大战作为名称变量,因为我使用的是电影数据库。我做错了什么 public void selectName(ObservableList<Movies> movieList, String name){ String sql = "SELECT id, name, year FROM movies WHERE nam

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

[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());
    }

您收到错误的原因是您正在执行[…]其中name=星球大战,这是无效的。如果您使用的是文本查询字符串,其中值是固定的,而不是用户输入,那么正确的查询应该是[…]其中name='starwars'

简单的解决方案似乎是将值括在单引号中,但是您永远不应该将值连接到查询字符串中,尤其是当它们是用户输入时,因为这会使您容易受到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
    }
}

您收到错误的原因是您正在执行[…]其中name=星球大战,这是无效的。如果您使用的是文本查询字符串,其中值是固定的,而不是用户输入,那么正确的查询应该是[…]其中name='starwars'

简单的解决方案似乎是将值括在单引号中,但是您永远不应该将值连接到查询字符串中,尤其是当它们是用户输入时,因为这会使您容易受到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
    }
}

通常,比较字符串的SQL语句需要字符串,因此您的SQL变量应该如下所示:从电影中选择id、name、year,其中name=starwars;为此,将其更改为:从电影中选择id、name、year,其中name=\+name+\;使用参数..通常比较字符串的SQL语句需要字符串,因此您的SQL变量应该如下所示:选择id、名称、电影中的年份,其中name=starwars;为此,将其更改为:从电影中选择id、name、year,其中name=\+name+\;使用参数。。