You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSP页面无法保存数据到数据库:SQL语法错误排查求助

JSP操作MariaDB时SQL语法错误(提示'?,?,?)'附近错误)

错误栈信息

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:478)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:380)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:328)
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
Root Cause

jakarta.servlet.ServletException: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '?,?,?)' at line 1
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:666)
org.apache.jsp.add_005fstu_jsp._jspService(add_005fstu_jsp.java:197)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:456)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:380)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:328)
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
Root Cause

java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '?,?,?)' at line 1
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121)
com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
com.mysql.cj.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1334)
com.mysql.cj.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2084)
com.mysql.cj.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1245)
org.apache.jsp.add_005fstu_jsp._jspService(add_005fstu_jsp.java:151)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:456)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:380)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:328)
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

前端HTML页面代码

<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="style1.css"/>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Student Registration</title>
    </head>
    <body>
        <div class="container">
        <h2>Student Registration</h2>
        <form id="add_stu_form" action="add_stu.jsp" method="POST">
            
            <label for="enrol" style="color:black">Enrollment no:</label>
            <input type="text" name="enrol" id="enrol" placeholder="Enrollment Number" required>
            
            <label for="fullname" style="color:black">Name:</label>
            <input type="text" name="fullname" id="fullname" placeholder="Full Name" required>
            
            <!--button type="submit">Add Student</button-->
            <p class="submit">
                <input type="submit" name="action" value="Save"> 
                <input type="submit" name="action" value="Delete"> 
                <input type="submit" name="action" value="Update"> 
            </p>
            <script></script>
        </form>
    </div>
    </body>
</html>

JSP处理代码

<%-- 
    Document   : add_stu
    Created on : 08-Apr-2024, 11:06:07 pm
    Author     : DC
--%>
<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%
    Class.forName("com.mysql.cj.jdbc.Driver"); 
    Connection con =DriverManager.getConnection("jdbc:mysql://localhost:3306/ams","root","");
   
    long enrl = Long.parseLong(request.getParameter("enrol"));
    String name = request.getParameter("fullname");
    Statement s0 = con.createStatement();
    ResultSet rs0 = s0.executeQuery("SELECT `No` FROM `stu_att`");
    int size = 0;
        while (rs0.next()) {
            size++;
        }
    int count = size + 1;
    int result;
    String sql;
    String button = request.getParameter("action");
    if("Save".equals(button)){
        sql = "INSERT INTO `stu_att`(`No`, `name`, `enrl`) VALUES (?,?,?)";
        PreparedStatement ps1 = con.prepareStatement(sql);
        ps1.setInt(1, count);
        ps1.setString(2, name);
        ps1.setLong(3, enrl);
        result = ps1.executeUpdate(sql);
    }
    else if("Delete".equals(button)){
        long del = enrl; //button2;
        sql = "DELETE FROM `stu_att` WHERE `enrl`=?";
        PreparedStatement ps2 = con.prepareStatement(sql);
        ps2.setLong(1, del);
        result = ps2.executeUpdate(sql);
    }
    else if("Update".equals(button)){
        long upd = enrl; //button2;
        sql = "UPDATE `stu_att` SET `name`='?' WHERE `enrl`=?";
        PreparedStatement ps3 = con.prepareStatement(sql);
        ps3.setString(1, name);
        ps3.setLong(1, upd);
        result = ps3.executeUpdate(sql);
    }
    else{
        result=001;
    }
%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Add Student</title>
    </head>
    <body>
        <p><%= result %> Record inserted!</p>
        <a href="">Back to home page</a>
    </body>
</html>

问题排查与修复方案

错误点1:PreparedStatement调用带参数的executeUpdate(sql)

使用PreparedStatement时,调用带SQL字符串参数的executeUpdate(sql)会退化为普通Statement执行,导致占位符?未被替换,直接作为SQL语法的一部分触发错误。
修复:调用无参的executeUpdate(),使用预编译好的SQL语句。

错误点2:Update语句中占位符加单引号

UPDATE语句里name='?'的写法错误,占位符?无需加单引号,加单引号后会被当作字符串字面量,而非参数占位符。
修复:将SQL改为UPDATE stu_attSETname=? WHERE enrl=?

错误点3:Update部分参数索引重复

设置Update语句参数时,两次使用索引1,导致第一个参数被覆盖,第二个占位符未赋值。
修复:调整索引顺序,name对应索引1,enrl对应索引2。

修复后的JSP核心代码片段

if("Save".equals(button)){
    sql = "INSERT INTO `stu_att`(`No`, `name`, `enrl`) VALUES (?,?,?)";
    PreparedStatement ps1 = con.prepareStatement(sql);
    ps1.setInt(1, count);
    ps1.setString(2, name);
    ps1.setLong(3, enrl);
    result = ps1.executeUpdate(); // 移除sql参数
}
else if("Delete".equals(button)){
    long del = enrl;
    sql = "DELETE FROM `stu_att` WHERE `enrl`=?";
    PreparedStatement ps2 = con.prepareStatement(sql);
    ps2.setLong(1, del);
    result = ps2.executeUpdate(); // 移除sql参数
}
else if("Update".equals(button)){
    long upd = enrl;
    sql = "UPDATE `stu_att` SET `name`=? WHERE `enrl`=?"; // 移除单引号
    PreparedStatement ps3 = con.prepareStatement(sql);
    ps3.setString(1, name); // 索引1对应name
    ps3.setLong(2, upd); // 索引2对应enrl
    result = ps3.executeUpdate(); // 移除sql参数
}

内容的提问来源于stack exchange,提问作者Effie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:33:10