将 Java 连接到 MySQL 数据库

2022-08-31 04:51:00

如何在Java中连接到MySQL数据库?

当我尝试时,我会得到

java.sql.SQLException: No suitable driver found for jdbc:mysql://database/table
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

答案 1

以下是如何安装MySQL和JDBC以及如何使用它的分步说明:

  1. 下载并安装 MySQL 服务器。只需以通常的方式进行操作即可。每当更改端口号时,请记住端口号。默认情况下为 .3306

  2. 下载 JDBC 驱动程序并放入类路径,解压缩 ZIP 文件并将包含 JAR 文件放在类路径中。特定于供应商的 JDBC 驱动程序是 JDBC API 的具体实现(此处为教程)。

    如果您使用的是 Eclipse 或 Netbeans 等 IDE,则可以通过将 JAR 文件作为添加到项目属性中的构建路径,将其添加到类路径中。

    如果您在命令控制台中执行“普通普通”操作,那么在执行 Java 应用程序时,您需要在 or 参数中指定 JAR 文件的路径。-cp-classpath

    java -cp .;/path/to/mysql-connector.jar com.example.YourClass

    只是将当前目录也添加到类路径中,以便它可以找到,并且是类路径分隔符,就像在Windows中一样。在Unix中,应该使用克隆。.com.example.YourClass;:

  3. 在 MySQL 中创建数据库。让我们创建一个数据库。你当然想要世界统治,所以让我们也使用UTF-8。javabase

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    
  4. 为 Java 创建一个用户授予其访问权限。仅仅因为使用是一种不好的做法。root

    CREATE USER 'java'@'localhost' IDENTIFIED BY 'password';
    GRANT ALL ON javabase.* TO 'java'@'localhost' IDENTIFIED BY 'password';
    

    是的,是用户名,是这里的密码。javapassword

  5. 确定 JDBC 网址。要使用Java连接MySQL数据库,您需要采用以下语法的JDBC URL:

    jdbc:mysql://hostname:port/databasename
    • 主机名:安装MySQL服务器的主机名。如果它安装在运行 Java 代码的同一台计算机上,则可以只使用 。它也可以是一个 IP 地址,如 .如果您遇到连接问题并使用而不是解决它,那么您的网络/ DNS /主机配置中存在问题。localhost127.0.0.1127.0.0.1localhost

    • 端口:MySQL服务器侦听的TCP / IP端口。默认情况下,这是 。3306

    • 数据库名称:要连接到的数据库的名称。那是。javabase

    所以最终的URL应该看起来像这样:

    jdbc:mysql://localhost:3306/javabase
  6. 使用Java测试与MySQL的连接。使用测试连接的方法创建一个简单的 Java 类。main()

    String url = "jdbc:mysql://localhost:3306/javabase";
    String username = "java";
    String password = "password";
    
    System.out.println("Connecting database...");
    
    try (Connection connection = DriverManager.getConnection(url, username, password)) {
        System.out.println("Database connected!");
    } catch (SQLException e) {
        throw new IllegalStateException("Cannot connect the database!", e);
    }
    

    如果你得到一个 ,那么这意味着JDBC驱动程序根本没有自动加载,或者JDBC URL是错误的(即它没有被任何加载的驱动程序识别)。通常,JDBC 4.0 驱动程序在运行时类路径中删除时应自动加载。要排除一个和另一个,您可以随时手动加载它,如下所示:SQLException: No suitable driver

    System.out.println("Loading driver...");
    
    try {
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("Driver loaded!");
    } catch (ClassNotFoundException e) {
        throw new IllegalStateException("Cannot find the driver in the classpath!", e);
    }
    

    请注意,此处不需要调用。这只是为了修复旧的和有缺陷的。解释在这里。如果这行抛出 ,则包含 JDBC 驱动程序类的 JAR 文件根本不被放置在类路径中。newInstance()org.gjt.mm.mysql.DriverClassNotFoundException

    请注意,在连接之前,您不需要每次都加载驱动程序。在应用程序启动期间只需一次就足够了。

    如果你得到一个或或一个MySQL特定的,那么这意味着数据库根本无法访问。这可能有以下一个或多个原因:SQLException: Connection refusedConnection timed outCommunicationsException: Communications link failure

    1. JDBC URL 中的 IP 地址或主机名错误。
    2. 本地 DNS 服务器无法识别 JDBC URL 中的主机名。
    3. JDBC URL 中的端口号缺失或错误。
    4. 数据库服务器已关闭。
    5. 数据库服务器不接受 TCP/IP 连接。
    6. 数据库服务器的连接已用完。
    7. Java和DB之间的某些东西正在阻止连接,例如防火墙或代理。

    要解决其中一个问题,请遵循以下建议:

    1. 使用 验证和测试它们。ping
    2. 刷新 DNS 或改用 JDBC URL 中的 IP 地址。
    3. 根据 MySQL DB 对其进行验证。my.cnf
    4. 启动数据库。
    5. 验证 mysqld 是否在没有 .--skip-networking option
    6. 重新启动数据库并相应地修复代码,使其关闭 中的连接。finally
    7. 禁用防火墙和/或配置防火墙/代理以允许/转发端口。

    请注意,关闭 非常重要。如果不关闭连接并在短时间内不断获取大量连接,则数据库可能会耗尽连接,并且应用程序可能会中断。始终在“使用资源试用”语句中获取 。或者,如果您还没有使用Java 7,请将其显式关闭在块中。关闭只是为了确保它在发生异常时也被关闭。这也适用于 和 。ConnectionConnectionfinallytry-finallyfinallyStatementPreparedStatementResultSet

就连通性而言,就是这样。您可以在此处找到更高级的教程,了解如何借助基本的 DAO 类在数据库中加载和存储完整的 Java 模型对象。


对数据库连接使用单例模式是一种不好的方法。除其他问题外,请参阅:http://stackoverflow.com/q/9428573/。这是一个#1启动器错误。


答案 2

DriverManager是一种相当古老的做事方式。更好的方法是通过查找您的应用服务器容器已为您配置的一个 来获取 一个 :DataSource

Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/myDB");

或直接从数据库驱动程序实例化和配置一个:

MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUser("scott");
dataSource.setPassword("tiger");
dataSource.setServerName("myDBHost.example.org");

然后从中获取连接,如上所述:

Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS");
...
rs.close();
stmt.close();
conn.close();

推荐