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

2019-04-16 13:07:22 +08:00
 hastyfish
为什么用
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");
就有结果

求大佬指导一下
659 次点击
所在节点    问与答
1 条回复
chaoschick
169 天前
这个问题通常是由于 `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` 的错误。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/555656

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX