Руководство по JDBC. Исключения.

Обработка исключений позволяет нам обрабатывать ошибки, которые могут возникнуть при работе программы и контролировать поведение программы при их появлении (в некоторых случаях).
Когда происходит ошибка, программа “бросает” исключение. Это означает, что выполнение программы прекращается и контроль передаётся ближайшему обработчику. Если обработчик не прописан, то выполнение программы прекращается полностью.
Механизм обработки исключений в JDBC крайне похож на механизм обработки исключений в самом языке Java. Чаще всего мы имеем дело с исключением java.sql.SQLException.

Рассмотрим методы классы SQLException:

  • getMessage()
    Принимает сообщение ошибки JDBC драйвера, которая обрабатывается драйвером, либо получает номер ошибки и сообщение для ошибки базы данных (далее – БД).
  • getSQLState()
    Принимает строку SQLState. Для ошибки JDBC драйвера. Этот метод не возвращает полезной информации.
  • getErrorCode()
    Возвращает код ошибки, который связан с исключением.
  • getNextException()
    Получает следующий экземпляр исключения в цепочке исключений.
  • printStackTrace()
    Отображает текущее исключение и обратный порядок в стандартный поток ошибок.
  • printStackTrace(PrintStream s)
    Печатает исключение и его обратный порядок в указанный поток.
  • printStackTrace(PrintWriter w)
    Печатает исключение и его обратный порядок в указанный writer.

Благодаря информации, которая предоставляется экземпляром исключения мы можем обработать данное исключение корректным образом и продолжить выполнение программы.

Для понимания того, как это работает на практике, рассмотрим пример простого приложения.

Пример:


import java.sql.*;

public class JdbcExceptionDemo {
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DATABASE_URL = "jdbc:mysql://localhost/PROSELYTE_TUTORIALS";

    static final String USER = "ВАШЕ_ИМЯ_ПОЛЬЗОВАТЕЛЯ";
    static final String PASSWORD = "ВАШ_ПАРОЛЬ";

    public static void main(String[] args) {
        Connection connection = null;

        try {
            Class.forName(JDBC_DRIVER);

            System.out.println("Connecting to database...");
            connection = DriverManager.getConnection(DATABASE_URL, USER, PASSWORD);

            System.out.println("Creating statement...");
            Statement statement = connection.createStatement();

            String SQL = "SELECT * FROM developers";
            ResultSet resultSet = statement.executeQuery(SQL);

            System.out.println("Displaying retrieved records...");

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                String specialty = resultSet.getString("specialty");
                int salary = resultSet.getInt("salary");

                System.out.println("\n==============");
                System.out.println("id: " + id);
                System.out.println("Name: " + name);
                System.out.println("Specialty: " + specialty);
                System.out.println("Salary: " + salary);
                System.out.println("==============\n");
            }

            System.out.println("Releasing resources...");
            resultSet.close();
            statement.close();
            connection.close();


            System.out.println("Thank You.");
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

В результате работы программы, мы получим, примерно, следующий результат:


/*Some System Messages*/

Connecting to database...
Creating statement...
Displaying retrieved records...

==============
id: 1
Name: Proselyte
Specialty: Java
Salary: 3000
==============


==============
id: 2
Name: Peter
Specialty: C++
Salary: 4000
==============


==============
id: 3
Name: AsyaSmile
Specialty: UI/UX
Salary: 3000
==============


==============
id: 4
Name: Eugene
Specialty: Java
Salary: 4000
==============


==============
id: 5
Name: Mike
Specialty: PHP
Salary: 2500
==============

Releasing resources...
Thank You.

В этом уроке мы изучили основы исключений при работе с JDBC и способ их обработки. Мы, также, рассмотрели пример простого приложения с его применением.

В следующем уроке мы изучим обработку пакетов в JDBC.