我正在尝试通过 Oracle 的“Java™ 教程”了解JDBC基础知识,现在我被困在这里:https ://docs.oracle.com/javase/tutorial/jdbc/basics/jdbcrowset.html 。
对于我的示例,我使用最新版本的Connector/J (mysql-connector-java-8.0.16.jar)来利用MySQL 服务器。到目前为止,司机按预期工作。它连接到 MySQL 服务器,创建数据库、表,用数据填充它们,并用检索到的数据填充普通的ResultSet对象。但是,一旦我尝试创建JdbcRowSet对象并执行 execute(),我就会收到 SQL 异常报告:“找不到合适的驱动程序...”
所以,现在我很怀疑:JdbcRowSet(以及 CachedRowSet / JoinRowSet / FilteredRowSet / WebRowSet)是否只是没有由 Connector/J 驱动程序实现,或者我做错了什么?还是 JDK 11 不再支持此功能?
这是一个例子:
import javax.sql.rowset.JdbcRowSet;
import javax.sql.rowset.RowSetProvider;
import java.sql.*;
import java.util.Properties;
public class JdbcRowSetTest {
public static void main(String[] args) {
String connectionURL =
"jdbc:mysql://localhost:3306/testdb?serverTimezone=Europe/Moscow";
String userName = "root";
String password = "root";
try {
Properties connectionProps = new Properties();
connectionProps.put("user", userName);
connectionProps.put("password", password);
System.out.println("Connect to database...");
Connection conn =
DriverManager.getConnection(connectionURL, connectionProps);
System.out.println("Retrieve and process data using ResultSet...");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from COFFEES");
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
float price = rs.getFloat("PRICE");
System.out.println(coffeeName + ", " + price);
}
System.out.println("Now, update the data using JdbcRowSet...");
JdbcRowSet jdbcRs = RowSetProvider.newFactory().createJdbcRowSet();
jdbcRs.setUrl(connectionURL);
jdbcRs.setUsername(userName);
jdbcRs.setPassword(password);
jdbcRs.setCommand("select * from COFFEES");
// it's where SQLException is thrown
jdbcRs.execute();
jdbcRs.absolute(2);
jdbcRs.updateFloat("PRICE", 10.99f);
jdbcRs.updateRow();
System.out.println("After updating the 2nd row:");
//... view updated table
} catch (SQLException e) {
e.printStackTrace();
}
}
}
这是输出:
Connect to database...
Retrieve and process data using ResultSet...
Colombian, 7.99
Espresso, 9.99
Now, update the data using ResultSet...
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/testdb?serverTimezone=Europe/Moscow
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
at java.sql.rowset/com.sun.rowset.JdbcRowSetImpl.connect(JdbcRowSetImpl.java:643)
at java.sql.rowset/com.sun.rowset.JdbcRowSetImpl.prepare(JdbcRowSetImpl.java:654)
at java.sql.rowset/com.sun.rowset.JdbcRowSetImpl.execute(JdbcRowSetImpl.java:556)
at JdbcRowSetTest.main(JdbcRowSetTest.java:37)
更新(可能的解决方案):
正如评论员在下面提到的,这里描述的问题与 MySQL 是否实现行集无关。对我来说,这似乎只是 JDK 11.0.1 的一个错误,因为一旦我更新了 JDK 12.0.1 的较新版本,问题就消失了,现在创建的 JdbcRowSet 对象没有任何 MySQLException。