Основы проектирования приложений баз данных

       

Использование JDBC-драйверов


Язык Java позволяет реализовывать доступ к таблице базы данных как через JDBC-драйверы, так и через мост JDBC-ODBC.

В любом случае для доступа к базе данных выполняется следующая последовательность действий:

  1. Загружается класс драйвера. Это можно выполнить двумя способами:
    • явно загрузить класс драйвера, регистрирующий себя в списке драйверов: // Параметр определяет применение моста JDBC-ODBC Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Параметр определяет применение JDBC-драйвера для БД Oracle DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    • добавить имя драйвера в список системного свойства jdbc.drivers. Названия драйверов в списке разделяются символом двоеточия (например, jdbc.drivers=my.sql.Driver:wombat.sql.Driver;). При инициализации класс DriverManager просматривает системное свойство jdbc.drivers и в том случае, если пользователь добавил один или несколько драйверов, менеджер драйверов пытается их загрузить.

  2. Устанавливается соединение с базой данных. После загрузки драйвера можно использовать класс DriverManager для открытия соединения с источником данных: // Мост JDBC-ODBC указывается как jdbc:odbc, // а DSN - это имя ODBC источника данных Connection con = DriverManager.getConnection ( "jdbc:odbc:DSN", "login", "password"); // Подключение к БД Oracle для пользователя scott с паролем tiger Connection con = DriverManager.getConnection ( "jdbc:oracle:oci:@datai_com", "scott", "tiger");

Загружать и регистрировать драйверы можно как методом Class.forName, так и методом DriverManager.registerDriver. Но в первом случае экземпляр драйвера создается неявно, а во втором при регистрации драйвера явным образом создается экземпляр драйвера.

При создании объекта типа Connection метод getConnection определяет параметр, содержащий JDBC-URL и передаваемый менеджером драйверов последовательно всем зарегистрированным драйверам: если драйвер распознает URL, то он возвращает экземпляр класса, реализующий интерфейс Connection.
Этот экземпляр класса и возвращает менеджер драйверов в результате вызова метода getConnection.

Далее для извлечения данных из результирующего набора в переменные языка Java выполняются:

  1. Создание результирующего набора при выполнении SQL-оператора SELECT: Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT F1,F2,F3 FROM Table1");
  2. Выборка данных из результирующего набора: while (rs.next()) { int x = rs.getInt("F1"); // Имя поля F1 String s = rs.getString("F2"); float f = rs.getFloat("F3"); }


Метод executeQuery используется для создания результирующего набора, а для выполнения SQL-оператора, изменяющего информацию в базе данных, вызывается метод executeUpdate.

После завершения работы с данными необходимо последовательно освободить результирующий набор, оператор и соединение.

Например:

rs.close(); stmt.close(); con.close();

Возвращать результирующий набор может не только выполнение оператора SELECT, но и выполнение хранимой процедуры. Вызов хранимых процедур определяется интерфейсом java.sql.CallableStatement.

Например:

import oracle.jdbc.driver.*; // Для работы с JDBC-драйвером Oracle import java.sql.*; : CallableStatement cstmt; // Вызываемый операторный объект cstmt= con.prepareCall("{packeg1.metod1(?)}") // Оператор вызова // хранимой процедуры packeg1.metod1 cstmt.registerOutParameter(1,OracleTypes.CURSOR); // Регистрация // выходного параметра cstmt.execute(); // Выполнение операторного объекта OracleResultSet ors= (OracleResultSet) ((OracleCallableStatement) cstmt).getCursor(1); // Получение // результирующего набора для БД Oracle // из выходного параметра хранимой процедуры

По умолчанию при подключении через JDBC установлен режим автокоммита. Для применения транзакций этот режим следует отключить, а фиксацию изменений указывать явным вызовом метода Commit.

Например:

Connection con = DriverManager.getConnection ("jdbc:oracle:oci:@datai_com", "scott", "tiger"); con.setAutoCommit(false); : con.commit(); // Фиксация транзакции : con.rollback(); // Откат транзакции



Следующий пример иллюстрирует код приложения, выполняющего создание таблицы базы данных, доступ к которой выполняется через мост JDBC-ODBC.

import java.sql.*; // Импорт пакета из JDK

public class CreateMyTable { public static void main(String args[]) { String url = "jdbc:odbc:myDataSource"; // myDataSource - // имя источника данных DSN Connection con; String createString = "create table TEST (P1 VARCHAR(32)," + " P2 INTEGER, " + " P3 FLOAT, " + " P4 INTEGER)" ; Statement stmt; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Загрузка драйвера

} catch(java.lang.ClassNotFoundException e) { System.err.print("ClassNotFoundException: "); System.err.println(e.getMessage()); } try { // Соединение с источником данных с использованием объекта типа Connection con = DriverManager.getConnection(url, "Login", "Psw"); stmt = con.createStatement(); // Создание объекта оператор класса Statement stmt.executeUpdate(createString); // Выполнение SQL-оператора stmt.close(); // Освобождение объекта "оператор" con.close(); // Закрытие соединения } catch(SQLException ex) { System.err.println("SQLException: " + ex.getMessage()); } } }


Содержание раздела