繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM