Java ps.executeUpdate(sql)抛出com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的sql语法有错误
我正在学习在Xampp服务器上使用mysql进行简单的数据库连接。数据库是在phpmyadmin上实现的。我正在从NetBeans IDE中的Javaservlet访问数据库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
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);