2016-11-22 84 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