MYSQL 删除语句不适用于 Java Servlet

MYSQL Delete statement not working with Java Servlet

我有一个允许用户输入单词的网页,提交该单词后,它将从 mysql 数据库中删除。然而,问题是语句没有被执行。

我的表格:

<form id="rem1" action="removeGER" method="GET">
        <input type="text" name="wordToRemoveGER" placeholder="Entry (GER)">
        <input type="submit" id="removeBtnGER" value="Remove Entry">
 </form>

我的 servlet:

@WebServlet(name = "removeGER", urlPatterns = {"/removeGER"})
public class removeGER extends HttpServlet {

/**
 * Handles the HTTP <code>POST</code> method.
 *
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html");
    String wordGER = request.getParameter("wordToRemoveGER");
    PrintWriter out = response.getWriter();

    out.println("<!DOCTYPE html>");
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Remove Word</title>");
    out.println("</head>");
    out.println("<body>");
    Connection conn = null;

    try {
        // Database Checking Area
        SimpleDataSource.init("/database.properties");
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(Register.class.getName()).log(Level.SEVERE, null, ex);
    }
    try {
        conn = SimpleDataSource.getConnection();
        Statement stat = conn.createStatement();
        //ResultSet result = 
        stat.executeQuery(" DELETE FROM `word` WHERE `word` = \""+wordGER+"\"");
        out.println("<h2>You have successfully removed the word " + wordGER + "!</h2>");
    } catch (SQLException ex) {
        Logger.getLogger(removeID.class.getName()).log(Level.SEVERE, null, ex);
    }
    out.println("</body>");
    out.println("</html>");
}

}

我知道正在从表单中正确检索字符串,并且我知道正在执行 try 块。问题似乎出在 mysql 语句本身。

使用

    executeUpdate('') 

而不是

    executeQuery('')

您还应确保在完成后关闭语句和连接

您有以下问题:

  1. 您正在执行多个语句,可能您的连接不允许。
  2. 当你执行多条语句时,你应该使用Statement#execute,而不是Statement#executeUpdate
  3. 如果您需要将参数传递给您的查询,请不要将其直接附加到您的 sql 中,这是造成 SQL Injection 攻击的原因。请改用 PreparedStatement

为此,请确保您的连接允许执行多个语句,方法是将此参数添加到您的连接中 URL:allowMultiQueries=true

连接 URL 的示例:

jdbc:mysql://<server>:<port>/<database>?allowMultiQueries=true

如果您使用 PreparedStatement:

,代码会是什么样子
conn = SimpleDataSource.getConnection();
String sql = "SET SQL_SAFE_UPDATES = 0; DELETE FROM `word` WHERE `word` = ?";
PreparedStatement stat = conn.prepareStatement(sql);
stat.setString(1, wordGER);
stat.execute();

既然您使用了单个删除语句,那么您只需要使用 PreparedStatement#executeUpdate 而不是 executeQuery