Московский государственный университет имени М.В.Ломоносова
Опубликован: 20.12.2005 | Доступ: свободный | Студентов: 3142 / 371 | Оценка: 4.22 / 3.86 | Длительность: 12:03:00
ISBN: 978-5-9556-0068-0
Лекция 13:

Реализация доступа к базам данных в среде JBUILDER и среде JDEVELOPER

Использование 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());
        }
    }
}