簡體   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