Java 我的insert语句无效

Java 我的insert语句无效,java,sqlite,servlets,Java,Sqlite,Servlets,我正在尝试向数据库中插入值,但如果有人能发现,代码似乎有问题。我使用Servlet获取用户输入,然后使用方法将输入发送到以下类: @Override public String createItem(String title, String info, String url, String imageFilename) { String addItem = title; Connection conn = null; try { Class.f

我正在尝试向数据库中插入值,但如果有人能发现,代码似乎有问题。我使用Servlet获取用户输入,然后使用方法将输入发送到以下类:

@Override
public String createItem(String title, String info, String url, String imageFilename) {

    String addItem = title;
    Connection conn = null;

    try
    {
        Class.forName("org.sqlite.JDBC");
        conn = DriverManager.getConnection("jdbc:sqlite:" + DBPath);


        if (conn == null)
        {
            System.err.println("Database connection was null:(");
            return addItem;
        }

        Statement stmt = conn.createStatement();
        String query = "INSERT INTO items (title, info, URL, image) VALUES (newtitle, newInfo, newUrl, newImage )";

        //String query = "INSERT INTO items  (title, info, URL, image) VALUES(" + title + "," + info + "," + url  +","+ imageFilename +")";

        stmt.executeUpdate(query);

        stmt.close();
    }

    catch(Exception e)
    {
        System.err.println("Exception querying database" + e.toString());
    }

    finally
    {
        try
        {
            conn.close();
        }
        catch(Exception e)
        {
        System.err.println("Exception querying database" + e.toString());
        }
    }
    return addItem;
}

我尝试在不使用从servlet传递到方法中的值的情况下键入值。 我已经检查了Sqlite管理器中的insert语句及其工作情况,我还检查了值是否已发送到上述类,它是否工作,并且我已经尝试了连接,因此它使我能够从中检索数据,但不能插入到其中。因此,我不知道它为什么不在数据库中存储值。

此插入肯定不起作用:

String query = "INSERT INTO items (title, info, URL, image) VALUES (newtitle, newInfo, newUrl, newImage )";
即使要将它们存储为字符串文字,也必须在SQL语句中使用单引号,如下所示:

String query = "INSERT INTO items (title, info, URL, image) VALUES ('newtitle', 'newInfo', 'newUrl', 'newImage' )";
PreparedStatement stmt = conn.prepareStatement(
    "INSERT INTO items (title, info, URL, image) VALUES (?, ?, ?, ?)"
);
stmt.setString(1, newtitle);
stmt.setString(2, newInfo);
stmt.setString(3, newUrl);
stmt.setString(4, newtitle);
stmt.executeUpdate();
要存储实际值,而不是我猜您想要的变量名,请使用以下PreparedStatement:

String query = "INSERT INTO items (title, info, URL, image) VALUES ('newtitle', 'newInfo', 'newUrl', 'newImage' )";
PreparedStatement stmt = conn.prepareStatement(
    "INSERT INTO items (title, info, URL, image) VALUES (?, ?, ?, ?)"
);
stmt.setString(1, newtitle);
stmt.setString(2, newInfo);
stmt.setString(3, newUrl);
stmt.setString(4, newtitle);
stmt.executeUpdate();

这样做可以防止SQL注入攻击。

什么确切的症状使您得出结论,代码似乎有问题?1-我已尝试用其他方法连接到数据库,但在使用SELECT语句时,它工作正常,可以从中检索数据。2-我检查我在方法中传递的变量是否正常工作,正如您所看到的,我正在将一部分值返回servlet,并且它显示字符串addItem=title;。但你还没有描述任何症状。它不起作用不是症状,而是抱怨。我无法将数据存储到数据库这应该做什么:Class.forNameorg.sqlite.JDBC;?我想这会管用的。仅当值不是单个标记时才需要使用引号。我是否要更改?到变量名???或者只有我们在setString中有变量名。不要更改问号,保持原样。setString会处理剩下的部分。非常感谢它的工作,但是我提供的代码是否能让它工作?我不太清楚你为什么要用你原来的方式来做。更重要的是,这种方式可以防止SQL注入。如果你不熟悉的话,请立即阅读。