Драйвер MySQL Connector / J реализует интерфейс JdbcRowSet? - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь познакомиться с JDBC основами через "Учебные руководства Java" Oracle, и теперь я застрял прямо здесь: https://docs.oracle.com/javase/tutorial/jdbc/basics/jdbcrowset.html.

Для моих примеров я использую MySQL Server с последней версией Connector / J (mysql-connector-java-8.0.16.jar). Пока что водитель работал как положено. Он получает соединение с MySQL Server, создает базу данных, таблицы, заполняет их данными и заполняет извлеченные данные обычными объектами 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.

...