Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ps.executeUpdate(sql)抛出com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的sql语法有错误_Java_Mysql_Jdbc - Fatal编程技术网

Java ps.executeUpdate(sql)抛出com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的sql语法有错误

Java ps.executeUpdate(sql)抛出com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的sql语法有错误,java,mysql,jdbc,Java,Mysql,Jdbc,我正在学习在Xampp服务器上使用mysql进行简单的数据库连接。数据库是在phpmyadmin上实现的。我正在从NetBeans IDE中的Javaservlet访问数据库 package com.DBcheck; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedS

我正在学习在Xampp服务器上使用mysql进行简单的数据库连接。数据库是在phpmyadmin上实现的。我正在从NetBeans IDE中的Javaservlet访问数据库

package com.DBcheck;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;


public class NewServlet extends HttpServlet {


protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException, ClassNotFoundException, SQLException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        /* TODO output your page here. You may use following sample code. */
       Class.forName("com.mysql.jdbc.Driver");

        Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/profilebuilder","root","");

        String sql="insert into signupdetailstable(FirstName) values(?)";
        PreparedStatement ps=con.prepareStatement(sql);

        ps.setString(1, "nirmal");        
        int log=ps.executeUpdate(sql);
        out.println(log);
    }
}


@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    try {
        processRequest(request, response);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(NewServlet.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(NewServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
}


@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    try {
        processRequest(request, response);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(NewServlet.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(NewServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
}


@Override
public String getServletInfo() {
    return "Short description";
}// </editor-fold>

}

谁能帮我解释一下这个例外的意思吗?

这是一个非常容易犯的错误。您使用的是
Statement\executeUpdate(String)
而不是
PreparedStatement\executeUpdate()

相反,您希望:

int log=ps.executeUpdate();
// Nothing here ---------^
PreparedStatement
拥有
executeUpdate(String)
的唯一原因是它是
语句的子类。但是使用
PreparedStatement
,在构造语句时提供SQL,这是正确的:

PreparedStatement ps=con.prepareStatement(sql);

然后您不需要将它提供给
executeUpdate

请不要使用[servlets]标记,只要使用带有
main()
方法的普通Java应用程序类可以重现同样的问题。这表明它与特定的servlet无关。是的,您可能认为这是API设计中的一个缺陷。(我当然知道。)谢谢你的快速帮助。你的建议奏效了@TJCrowder
int log=ps.executeUpdate();
// Nothing here ---------^
PreparedStatement ps=con.prepareStatement(sql);