2016-11-22 85 views
1

我有一個刪除專輯DAO,一個刪除專輯類和一個刪除servlet都連接到數據庫,但它仍然不運行查詢,即它不起作用。我的刪除Servlet不會從數據庫中刪除

下面的代碼是刪除的servlet

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     String name = request.getParameter("name"); 

     DeleteAlbum Album = new DeleteAlbum(name) ; 

     AlbumDAO.INSTANCE.delete(Album); 

     request.getRequestDispatcher("home.jsp").forward(request, response); 
    } 

這是刪除相冊類

 public class DeleteAlbum { 
      String name ; 

      public DeleteAlbum(String name){ 
       super(); 

       this.name = name; 
      } 
      public String getName() { 
       return name; 
      } 
      public void setName(String name) { 
       this.name = name; 
      } 

     } 

而且這部分代碼連接到數據庫

public enum DeleteAlbumDAO { 
     INSTANCE; 

     public Connection getConnection() { 
      Connection con = null ; 
      try { 
       Class.forName("org.hsqldb.jdbcDriver"); 
       con = DriverManager.getConnection(
         "jdbc:hsqldb:hsql://localhost/oneDB", "sa", ""); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return con ; 
     } 

     public void delete(Album name) {  
      try { 
       Connection con = getConnection() ; 
       Statement stmt = con.createStatement(); 
       stmt.executeUpdate("Delete from ALBUM WHERE name="+name+""); 
       System.out.println("Connection Succesful"); 
       stmt.close(); 
       con.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 

這是原始ALBUM DAO的代碼,我試圖通過名稱刪除專輯,我添加albumDAO以測試ti是否是連接,但它仍然不能正常工作

import model.Album; 
import model.DeleteAlbum; 

public enum AlbumDAO { 
    INSTANCE; 

    public Connection getConnection() { 
     Connection con = null ; 
     try { 
      Class.forName("org.hsqldb.jdbcDriver"); 
      con = DriverManager.getConnection(
        "jdbc:hsqldb:hsql://localhost/oneDB", "sa", ""); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return con ; 
    } 

    public void save(Album album) {  
     try { 
      Connection con = getConnection() ; 
      Statement stmt = con.createStatement(); 

      stmt.executeUpdate("INSERT INTO ALBUM (name, artist , genre)" 
         + "VALUES ('" + album.getName() + "','"+ album.getArtist() + "','"+ album.getGenre() + "')"); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void delete(DeleteAlbum name) {  
     try { 
      Connection con = getConnection() ; 
      Statement stmt = con.createStatement(); 
      stmt.executeUpdate("Delete from ALBUM WHERE name="+name+""); 
      stmt.close(); 
      con.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

它不會從我的數據庫中刪除 – deecobbk

+0

'stmt.executeUpdate(「從ALBUM WHERE name =」+ name +「」刪除);''這裏的'name'是'Album'對象。您可能需要接受'DeleteAlbum'並調用album.getName()'。 –

+0

你確實需要了解準備好的陳述和參數:你忘了名字周圍的引號,即使你沒有忘記它們,如果專輯名稱包含引號,陳述仍然會失敗。 http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html –

回答

0

你實際上並沒有傳遞alubum名準備好的語句,所以你需要改變delete方法如下所示:

public void delete(DeleteAlbum album) {  
     //Use try with resources as shown below which closes conn & stmt objects 
     try(Connection con = getConnection() ; 
      PreparedStatement stmt = con.prepareStatement("Delete from ALBUM WHERE name=?")) { 

      stmt.setString(1, album.getName()); 
      stmt.executeUpdate(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

請使用preparedstament setString(),setInt()等方法以避免SQL injections。您可以參考here

此外,請確保您正在使用try with resources或關閉finally塊中的資源,以避免連接泄漏。

+0

不知道爲什麼downvoted,請發表評論 – developer

+0

你的SQL無效,它促進了使用字符串連接來傳遞參數。閱讀我對這個問題的評論。 –

+0

@JBNizet我只是編輯問題來建議相同的 – developer