使用Servlet和Prepared语句的java UPDATE类找不到异常(MySQL驱动程序)
因此,感谢下面的建议,我将使用语句的第一种方法改为使用准备好的语句,我还将verifyUser方法从ConnectDB中分离出来,将其放入一个新的用户类中(这是我在作业中要求的)
现在我不再使用任何NPE,而是另一个,MySQL JDBC驱动程序的类Not Found Exception
用户类的代码如下所示:
public class Users {
private String login;
private String password;
public Users(String login, String password) {
this.login = login;
this.password = password;
}
public String getUsername() {
return login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setUsername(String login) {
this.login = login;
}
public boolean verifyUser(String login, String password) throws SQLException {
ConnectDB cdb = new ConnectDB();
Connection cn = DriverManager.getConnection(cdb.url, cdb.login, cdb.password);
PreparedStatement ps = cn.prepareStatement("SELECT password FROM users WHERE login LIKE ? ");
ps.setString(1,username);
ResultSet rs=ps.executeQuery();
rs.next();
if (rs.getString(2).equals(password)) {
System.out.println("TEST");
return true;
}
else
return false;
}
}
这是我的ConnectDB类:
public class ConnectDB {
String url = "jdbc:mysql://localhost:3306/entreprise";
String login = "root";
String password = "kamoulox369";
Connection connection = null;
Statement st = null;
ResultSet rs = null;
PreparedStatement ps = null;
public void getConnection() {
try {
Class.forName("com.example.mysql.jdbc.Driver");
connection = DriverManager.getConnection(url, login, password);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
将其放在一起,在Servlet中使用:
private void versIndex(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException {
String login = request.getParameter("user");
String password = request.getParameter("password");
Users user = new Users(login,password);
ConnectDB cdb = new ConnectDB();
cdb.getConnection();
if (user.verifyUser(login, password)) {
RequestDispatcher rd = sc.getRequestDispatcher("/index.jsp");
rd.forward(request, response);
}
}
当然,我得到的错误是:
java.lang.ClassNotFoundException: com.example.mysql.jdbc.Driver
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1309)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1138)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:291)
at com.example.ConnectDB.getConnection(ConnectDB.java:16)
at com.example.Servlet.versIndex(Servlet.java:111)
at com.example.Servlet.doPost(Servlet.java:41)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:491)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:764)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1388)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:844)
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/entreprise
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
at com.example.Users.verifyUser(Users.java:36)
at com.example.Servlet.versIndex(Servlet.java:113)
at com.example.Servlet.doPost(Servlet.java:41)
# 1 楼答案
Servlet或jdbc并不简单。他们都容易出错
您存在并发问题、资源问题,无法关闭任何东西(包括连接中断),以及sql注入漏洞
在这里使用静态成员是灾难性的。每个请求在不同的线程上执行,它们都将覆盖其他线程正在使用的对象。应使用局部变量处理每个请求
数据库连接永远不会关闭,数据库将耗尽连接并在某个点停止工作。处理完所有jdbc对象后关闭它们
将用户输入的输入连接到您运行的sql中允许用户在没有有效密码的情况下进入或运行任意sql。使用PreparedStatement