【问题标题】:Java error "The resource type Connection does not implement java.lang.AutoCloseable" in the try-catch connection在 try-catch 连接中出现 Java 错误“资源类型连接未实现 java.lang.AutoCloseable”
【发布时间】:2021-08-20 17:34:28
【问题描述】:

我在可自动关闭的类中遇到此错误,在我尝试建立连接以将数据插入 mysql 数据库的线路上,在 try-catch 中。我做了所有必要的导入,对包和类的引用,但我没有成功

错误所在行:

try (Connection connection = getConnection();
                PreparedStatement preparedStatement = connection.prepareStatement(INSERT_CRIANCA_SQL))
package dao;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.sun.jdi.connect.spi.Connection;

import model.Crianca;

public class CriancaDao {
    
    private String jdbcURL = "jdbc:mysql://localhost:3306/userdb?useSSL=false";
    private String jdbcUsername = "root";
    private String jdbcPassword = "root";
    private String jdbcDriver = "com.mysql.jdbc.Driver";
    
    private static final String INSERT_CRIANCA_SQL = "INSER INTO crianca" + "(nome,cpf,email,dataNasc,senha,responsavel,dentistaResponsavel,avatar,atendimento) VALUES " + "(? , ? , ? , ? , ? , ?, ?, ?, ?); ";
    private static final String SELECT_CRIANCA_BY_ID = "select id, nome,cpf,email,dataNasc,senha,responsavel,dentistaResponsavel,avatar,atendimento from crianca  where id =?";
    private static final String SELECT_ALL_CRIANCA = "select * from crianca";
    private static final String DELETE_CRIANCA_SQL = "select from crianca where id = ?";
    private static final String UPDATE_CRIANCA_SQL = "update crianca set name = ?, cpf ?, email = ?, dataNasc = ?, senha = ?, responsavel = ?, dentistaResponsavel = ?, avatar = ?, atendimento = ? ;";
    
    public CriancaDao() {
        
    }
    protected Connection getConnection() {
        Connection connection = null;
        try {
            Class.forName("jdbcDriver");
            connection = (Connection) DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);     
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return connection;
    }
    
    public void insertCrianca(Crianca crianca) throws SQLException {
        System.out.println(INSERT_CRIANCA_SQL);
        try (Connection connection = getConnection();
                PreparedStatement preparedStatement = connection.prepareStatement(INSERT_CRIANCA_SQL)) {
            preparedStatement.setString(1,  crianca.getNome());
            preparedStatement.setString(2,  crianca.getCpf());
            preparedStatement.setString(3,  crianca.getEmail());
            preparedStatement.setString(4,  crianca.getDataNasc());
            preparedStatement.setString(5,  crianca.getSenha());
            preparedStatement.setString(6,  crianca.getResponsavel());
            preparedStatement.setString(7,  crianca.getDentistaResponsavel());
            preparedStatement.setString(8,  crianca.getAvatar());
            preparedStatement.setString(9,  crianca.getAtendimento());
            System.out.println(preparedStatement);
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            printSQLException(e);
        }
    }
    
    }

【问题讨论】:

    标签: java class mysql-connector


    【解决方案1】:
    try (Connection connection = getConnection();
                    PreparedStatement preparedStatement = connection.prepareStatement(INSERT_CRIANCA_SQL))
    

    这条语句意味着你可以使用 try-with-resources 块中的任何类,只要它实现了 AutoCloseable 接口。

    也许您的库版本与 Java 版本不兼容。你可以寻找与java版本兼容的库。

    【讨论】:

      【解决方案2】:

      您使用了错误的Connection。您正在使用的Connection 类,来自包com.sun.jdi.connect.spi,不是数据库连接,不能与java.sql 中的其他类一起使用。根据Javadocs,它是“调试器和它调试的目标虚拟机之间的[a] 连接。”。它也没有实现AutoCloseable,导致你的错误。

      Connection 的导入更改为从java.sql 导入。 That interface does extend AutoCloseable.

      import java.sql.Connection;
      

      【讨论】:

        最近更新 更多