V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hastyfish
V2EX  ›  问与答

关于 JDBC 连接 Mysql,求一个大佬

  •  
  •   hastyfish · 2019-04-16 13:07:22 +08:00 · 633 次点击
    这是一个创建于 2046 天前的主题,其中的信息可能已经有所发展或是发生改变。
    为什么用
    Class.forName("com.mysql.cj.jdbc.Driver");
    JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();
    rowSet.setUrl("jdbc:mysql://localhost:3306/sonoo");
    rowSet.setUsername("root");
    rowSet.setPassword("root");
    rowSet.setCommand("select * from user420");
    rowSet.execute();
    会报错 java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/sonoo


    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection con =
    DriverManager.getConnection("jdbc:mysql://localhost:3306/sonoo","root","root");
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("select * from user420");
    就有结果

    求大佬指导一下
    1 条回复    2024-08-31 14:24:29 +08:00
    chaoschick
        1
    chaoschick  
       82 天前
    这个问题通常是由于 `JdbcRowSet` 和 `DriverManager` 处理 JDBC 驱动的方式有所不同。让我们逐步分析:

    ### 1. **`Class.forName("com.mysql.cj.jdbc.Driver")` 的作用**
    - 这行代码的作用是加载并注册 MySQL 的 JDBC 驱动程序。在大多数现代 JDBC 驱动程序中,这步操作是自动完成的,因为 JDBC 4.0 引入了自动加载驱动的功能,但显式调用 `Class.forName` 可以确保兼容性。

    ### 2. **`DriverManager.getConnection` 的行为**
    - 当使用 `DriverManager.getConnection` 时,`DriverManager` 会根据你提供的 JDBC URL (`jdbc:mysql://localhost:3306/sonoo`) 查找已经注册的驱动程序,并找到合适的驱动来建立连接。因为 `Class.forName` 已经注册了 MySQL 驱动,所以能够正常连接数据库。

    ### 3. **`JdbcRowSet` 的行为**
    - `JdbcRowSet` 是一种 RowSet ,它通过内部的 `Connection` 对象来连接数据库。你在创建 `JdbcRowSet` 时并没有显式地传入 `Connection`,而是通过 `setUrl` 等方法提供连接信息。

    - 关键问题在于,`JdbcRowSet` 使用的连接过程可能与 `DriverManager` 不同。特别是当 `JdbcRowSet` 使用 `RowSetProvider` 创建时,内部可能没有找到合适的驱动程序来处理 `jdbc:mysql://localhost:3306/sonoo` 这个 URL 。

    ### **为什么会出现 `No suitable driver found` 错误**

    - 在使用 `DriverManager.getConnection` 时,`DriverManager` 已经注册并正确识别了 MySQL 驱动程序,因此能成功建立连接。
    - 然而,在使用 `JdbcRowSet` 时,如果它不能正确加载 MySQL 驱动程序(可能是因为 `RowSetProvider` 的内部实现或者没有正确注册驱动),那么它就会抛出 `java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/sonoo` 这样的错误。

    ### **解决方法**

    1. **显式加载 JDBC 驱动:**
    确保在使用 `JdbcRowSet` 前已经加载并注册了 MySQL 驱动程序:
    ```java
    Class.forName("com.mysql.cj.jdbc.Driver");
    ```

    2. **使用 `JdbcRowSet` 时显式传入连接:**
    你可以先创建一个 `Connection` 对象,然后将其传入 `JdbcRowSet` 中使用:
    ```java
    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sonoo","root","root");
    JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();
    rowSet.setCommand("select * from user420");
    rowSet.execute(con); // 使用已有的 Connection 对象
    ```

    这种方式确保 `JdbcRowSet` 使用的连接和 `DriverManager` 创建的连接是相同的。

    3. **确保 `RowSetProvider` 支持 MySQL:**
    如果你使用的 `RowSetProvider` 实现确实不支持 MySQL ,考虑使用替代的 `RowSet` 实现,或者确保你的环境中已正确配置支持 MySQL 的 `RowSetProvider`。

    通过上述方法,可以避免 `JdbcRowSet` 报 `No suitable driver found` 的错误。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1167 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:14 · PVG 02:14 · LAX 10:14 · JFK 13:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.