java.lang.AbstractMethodError:com.mysql.jdbc.PreparedStatement.setBlob(ILjava / io / InputStream;)V

我试图在MySQL数据库中保存上传的文件,如下所示:

String firstName = request.getParameter("firstName"); String lastName = request.getParameter("lastName"); InputStream inputStream = null; // input stream of the upload file // obtains the upload file part in this multipart request Part filePart = request.getPart("photo"); if (filePart != null) { // prints out some information for debugging System.out.println(filePart.getName()); System.out.println(filePart.getSize()); System.out.println(filePart.getContentType()); // obtains input stream of the upload file inputStream = filePart.getInputStream(); } Connection conn = null; // connection to the database String message = null; // message will be sent back to client try { // connects to the database DriverManager.registerDriver(new com.mysql.jdbc.Driver()); conn = DriverManager.getConnection(dbURL, dbUser, dbPass); // constructs SQL statement String sql = "INSERT INTO image(image,firstName, lastName) values (?, ?, ?)"; PreparedStatement statement = conn.prepareStatement(sql); if (inputStream != null) { // fetches input stream of the upload file for the blob column statement.setBlob(1, inputStream); } statement.setString(2, firstName); statement.setString(3, lastName); // sends the statement to the database server int row = statement.executeUpdate(); if (row > 0) { message = "File uploaded and saved into database"; } } catch (SQLException ex) { message = "ERROR: " + ex.getMessage(); ex.printStackTrace(); } finally { if (conn != null) { // closes the database connection try { conn.close(); } catch (SQLException ex) { ex.printStackTrace(); } } // sets the message in request scope request.setAttribute("Message", message); // forwards to the message page getServletContext().getRequestDispatcher("/Message.jsp").forward(request, response); } 

当我运行这个我得到一个错误,这是:

 javax.servlet.ServletException: Servlet execution threw an exception root cause java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setBlob(ILjava/io/InputStream;)V UploadServlet.doPost(UploadServlet.java:64) javax.servlet.http.HttpServlet.service(HttpServlet.java:641) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

这个错误的原因是什么?输入字段名是firstName,lastName和photo

正如giorgiga在这篇文章中所述,它是你的JDBC驱动程序的版本。 更新它或使用旧版本的setBlob。

编辑:取自giorgiga的回答以防万一链接死亡。

AbstractMethodError意味着您的JDBC驱动程序的PreparedStatements不实现setBlob(int,InputStream,long)。

使用旧的setBlob(int,Blob)或更新驱动程序(Connector / J 5.1实现Jdbc 4.0,这应该是setBlob所需要的(int,InputStream,long))

您应该使用mysql-connector-java-5.1.7-bin.jar来完成这项工作。