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

15,614

Solution 1

You should use mysql-connector-java-5.1.7-bin.jar to make this work.

Solution 2

As stated by giorgiga in this post its your JDBC driver's version. Either update it or use the older version of setBlob.

Edit: Taken from giorgiga's answer just in case link dies.

AbstractMethodError means your JDBC driver's PreparedStatements don't implement setBlob(int, InputStream, long).

Use the older setBlob(int, Blob) or update your driver (Connector/J 5.1 implements Jdbc 4.0, which should be what you need for setBlob(int, InputStream, long))

Share:
15,614
user2137186
Author by

user2137186

Updated on June 05, 2022

Comments

  • user2137186
    user2137186 almost 2 years

    I am trying to save an uploaded file in MySQL database as follows:

    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);
    }
    

    When i run this i get an error which is:

    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)
    

    what could be the reason of this error ?input field names are firstName,lastName and photo

  • user2137186
    user2137186 about 11 years
    whats the older version of setBlob?
  • user2137186
    user2137186 about 11 years
    this is the older version i guess