比如在我们用servlet写对学生表的增删改查功能。我举得栗子只一个单表查询,能说明问题就行。一般会有如下几个包:
在StudentDao中完成对数据的处理,也就是SQL语句是要写在这个里面。
@Override
public void deleteStudentById(Integer id) {
Connection connection=null;
PreparedStatement pst=null;
ResultSet rs=null;
String sql="delete from student where id=?";
try {
connection=JdbcUtil.getConnection();
pst=connection.prepareStatement(sql);
pst.executeUpdate();
pst.setInt(1, id);
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}finally {
JdbcUtil.close(rs, pst, connection);
}
}
这段就是对删除功能的数据处理。
在确保其他部分都是对的情况下,在界面中点击删除按钮,会发现并没有反映,界面上也不会报错,但是eclipce中的console会报下面这种错:
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
com.mysql.jdbc.JDBC4PreparedStatement@492898d1: delete from student where id=** NOT SPECIFIED **
java.sql.SQLException: No value specified for parameter 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2549)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2525)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2372)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2316)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2301)
at com.baidu.dao.StudentDao.deleteStudentById(StudentDao.java:48)
at com.baidu.service.StudentService.deleteStudentById(StudentService.java:18)
at com.baidu.controller.StudentServlet.delStudentList(StudentServlet.java:73)
at com.baidu.controller.StudentServlet.doGet(StudentServlet.java:27)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
这个时候就应该知道是sql语句中有问题。仔细看其他部分也没毛病。但是你会发现
这个部分这样写是不合理的。应该先对id赋值,再去执行pst.executeUpdate();把位置换一下再去执行就OK啦~
如果还不行就要清一下缓存试试: