Java: подключение к базам данных Oracle

Java: подключение  к базам данных Oracle

Часто для выполнения задач по манипулированию данными программам Java требуется подключиться к базе данных. JDBC — это интерфейс, который позволяет программе Java подключаться к базе данных и выдавать операторы DML и DDL. Интерфейс JDBC позволяет использовать динамические операторы SQL в тех ситуациях, когда количество и тип столбцов неизвестно до времени выполнения. (При написании статического SQL-кода можно применять интерфейс SQLJ, который позволяет вставлять операторы SQL в код Java.) JDBC предоставляет обширную библиотеку подпрограмм, которые помогают открывать и закрывать соединения с базами данных и обрабатывать данные.



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

 

Установка соединения с базой данных Oracle

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

  • Тонкий драйвер JDBC. Этот простейший клиентский драйвер Java предоставляет прямое соединение с базой данных посредством протокола TCP/IP. Этот драйвер требует наличия слушателя и использует сокеты для установления соединений базами данных.
  • OCI-драйвер JDBC. Этот драйвер требует наличия клиентской инсталляции Oracle, поэтому он является специфичным для Oracle. Этот драйвер в высшей степени масштабируем, и он может использовать пул соединений для обслуживания большого количества пользователей.
  • Тонкий драйвер серверной стороны JDBC. Действуя на сервере, этот драйвер подключается к удаленным базам данных и предоставляет те же функциональные возможности, что и тонкий драйвер клиентской стороны.
  • Внутренний драйвер серверной стороны JDBC. Как видно из его названия, этот драйвер располагается на сервере и используется виртуальной машиной Java Virtual Machine (Virtual Machine Java — JVM) для обмена данными с сервером базы данных Oracle.

После выбора конкретного типа драйвера JDBC необходимо указать драйвер JDBC одним из двух способов: используя статический метод registerDriver() класса DriverManager JDBC или применяя метод forName() класса java.lang. Эти два метода указания драйвера JDBC имеют следующий вид: 

DriverManager.registerDriver ("new oracle.jdbc.OracleDriver()");

и

Class.forName("oracle.jdbc.driver.OracleDriver") 

Как только драйвер JDBC загружен, с помощью статического метода getConnection() класса DriverManager можно установить соединение с базой данных. Этот метод создаст экземпляр класса connection JDBC. Соответствующий код приведен в листинге ниже.


connection conn=DriverManager.getConnection("jdbc:oracle:thin:@prod1:1521:finprod", username, passwd);
   /* Различные части объекта соединения означают следующее: */
   jdbc=protocol
   oracle=vendor
   thin=driver
   prod1=server
   1521=port number
   finprod=Oracle database
   username=database username
   password=database password

Если вся предоставленная информация верна, соединение с базой данных будет установлено из приложения Java.

 

Работа с базой данных Oracle из Java

Теперь, когда вы научились подключаться к базе данных, используя интерфейс JDBC, пора выяснить, как посредством JDBC-соединения можно обрабатывать операторы SQL в базе данных.

SQL-код нельзя выполнять непосредственно из программы Java. Вначале потребуется создать операторы JDBC, а затем нужно будет выполнить SQL-операторы. Давайте подробно рассмотрим эти два этапа.

 

Создание объекта Statement

Чтобы передать SQL-операторы базе данных, необходимо создать JDBC-объект Statement. Этот объект свяжет себя с открытым соединением, и в дальнейшем будет действовать в качестве канала, по которому SQL-операторы будут передаваться из программы Java в базу данных для выполнения. Объект Statement JDBC создается следующим образом: 

statement stmt = conn.createStatement();

С объектом stmt никакие SQL-операторы не связаны. Однако класс Statement содержит еще один объект, названный PreparedStatement, который, кроме того, что служит каналом для выполнения операторов, всегда содержит SQL-оператор. Этот SQL- оператор компилируется немедленно, причем он может компилироваться только один раз, а затем использоваться многократно, что является огромным преимуществом.

Однако для простоты в этом разделе описано только использование объекта Statement. Теперь рассмотрим выполнение SQL-операторов.

 

Выполнение SQL-операторов

Чтобы понять работу SQL-операторов JDBC, следует отделить операторы SELECT, выполняющие запросы к базе данных, от всех остальных операторов. В отличие от других операторов, операторы SELECT не изменяют состояние базы данных.

Вначале рассмотрим операторы обработки запросов.

 

Обработка запросов

Для получения результатов запроса операторы SELECT используют метод execute- Query(). Этот метод возвращает результаты в объекте ResultSet. Пример приведен в листинге ниже.


string first_name,last_name,manager;
number salary;
resultSet rs = stmt.executeQuery("SELECT * FROM Employees");
while (rs.next()) {
   first_name = rs.getString("first_name");
   last_name = rs.getString("last_name");
   manager = rs.getString("manager");
   salary = rs.getNumber("salary");
   system.out.println(first_name + last_name "works for" Manager "salary is:" salary.");
 

Обратите внимание, что rs — это экземпляр объекта resultSet, и именно он содержит результаты запроса. Объект resultSet предоставляет также курсор, что позволяет обращаться к результатам одним за другим. При каждом вызове метода resultSet курсор перемещается к следующей строке в результирующем наборе.

 

Обработка операторов DDL и не связанных с запросами операторов DML

Любой оператор, который изменяет состояние базы данных — будь то оператор DDL или оператор DML, такой как INSERT, UPDATE либо DELETE — выполняется с помощью метода executeUpdate(). Обратите внимание, что слово “update” (“обновление”) в имени метода указывает, что SQL-оператор будет изменять что-либо в базе данных.

Вот несколько примеров операторов executeUpdate() 

statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE TABLE Employees" +
                   "(last_name VARCHAR2(30), first_name VARCHAR2(20),
                     manager VARCHAR2(30), salary(number");
stmt.executeUpdate("INSERT INTO Employees " +
                   "VALUES ('Alapati', 'Valerie', 'Shannon', salary)");

Приведенные операторы создают объект Statement, а затем создают таблицу и вставляют в нее определенные данные.

При использовании интерфейса для выполнения SQL-операторов все обычные свойства SQL-транзакций, такие как целостность и продолжительность, сохраняются. По умолчанию каждый оператор утверждается после его выполнения, поскольку, как видно из следующего примера, значение conn.setAutoCommit() установлено равным true. Утверждение после выполнения каждого оператора можно гарантировать любым из следующих способов (при желании можно применить метод conn.rollback(), чтобы выполнить откат оператора): 

conn.setAutoCommit(false);

или

conn.commit(); 

Ниже приведен простой пример, который демонстрирует использование операторов commit() и rollback():

conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO employees
                    VALUES('Alapati','Valerie','Nicholas',50000 )");
conn.rollback();
stmt.executeUpdate("INSERT INTO employees
                    VALUES('Alapati','Nina','Nicholas',50000)");
conn.commit();

Обработка ошибок

Все программы должны содержать встроенный обработчик исключений. Это особенно важно для тех операторов DML, которые изменяют состояние базы данных. Один из способов достижения этой цели предусматривает применение оператора rollback() при возникновении ошибки, что позволяет отменить все частичные изменения.

Для перехвата ошибок можно использовать метод SQLException(). В программах Java для генерирования (или выдачи) исключения используют блок кода try, а блок catch будет “перехватывать” выданное подобным образом исключение. Пример блока кода Java, который иллюстрирует эти концепции, приведен в листинге ниже.


try { conn.setAutoCommit(false);
stmt.executeUpdate(" " +
                   "(Disney World', 'MickeyMouse', 2.00)");
conn.commit();
conn.setAutoCommit(true);
}
catch(SQLException ex) {
system.err.println("SQLException: " + ex.getMessage());
conn.rollback();
conn.setAutoCommit(true);
}

 

Пример программы подключения к базе данных Oracle на Java 

Пример программы, в которой все концепции, рассмотренные в предшествующих разделах нашей статьи, сведены воедино, приведен в листинге ниже. Вначале эта программа регистрирует тонкий драйвер Oracle и с его помощью подключается к базе данных. Затем она обновляет некоторые строки в таблице и применяет результирующий набор для вывода данных.


/* импорт пакетов java */
import java.sql.*;
public class accessDatabase{
public static void main(String[] args)

throws SQLException {
   stringfirst_name,last_name ;
   number salary ;
   connection c = null;
   /* регистрация драйвера Oracle */
   try {
         class.forName("oracle.jdbc.driver.OracleDriver");
         c = DriverManager.getConnection(
               "jdbc:oracle:thin:@prod1:1521:finprod",
               "user", "user_passwd");
         /* создание объекта statement */
         statement s = c.createStatement();
         c.setAutoCommit(false);
         s.executeUpdate("CREATE TABLE employees " +
                         "(first_name VARCHAR2(30), last_name VARCHAR2(20),salary    NUMBER)");
         s.executeUpdate("INSERT INTO employee VALUES " +
                         "('nicholas', 'Alapati', 50000 )");
         c.commit();
         c.setAutoCommit(true);
         /* результирующий набор */
         resultSet rs = s.executeQuery("SELECT * FROM Employees");
         while( rs.next() ){
            first_name = rs.getString("first_name");
            last_name = rs.getString("last_name");
            salary = rs.getFloat("salary");
            System.out.println(first_name + last_name + " works for " +
                      Manager + " salary is:" + salary");
         }
         /* обработчик исключений */
      } catch (ClassNotFoundException ex){
            system.out.println(ex);
            } catch (SQLException ex){
               if ( c != null ){
                  c.rollback();
                  c.setAutoCommit(true);
            }
         system.out.println("SQLException caught");
         system.out.println("---");
         while (ex != null){
            system.out.println("Message : " + ex.getMessage());
            system.out.println("SQLState : " + ex.getSQLState());
            system.out.println("ErrorCode : " + ex.getErrorCode());
            system.out.println("---");
            ex = ex.getNextException();
         }
      }
   }
}

Поскольку в данном случае нас интересует администрирование базы данных Oracle, а не особенности программирования, эта простая программа Java, в основном, призвана привлечь внимание к аспектам соединения с базами данных Oracle.

Вас заинтересует / Intresting for you:

Распространенные заблуждения о...
Распространенные заблуждения о... 2490 просмотров Ирина Светлова Thu, 21 Jun 2018, 18:35:12
Выбор среды для разработки код...
Выбор среды для разработки код... 2539 просмотров Stas Belkov Sun, 10 Jun 2018, 14:21:35
Аплеты Java и Интернет
Аплеты Java и Интернет 2634 просмотров Ирина Светлова Sat, 09 Jun 2018, 10:17:34
Использование потоков в Java
Использование потоков в Java 1459 просмотров Antoni Wed, 12 May 2021, 09:51:36
Войдите чтобы комментировать

apv аватар
apv ответил в теме #9443 4 года 6 мес. назад
Очень хорошая статья, Александр. Спасибо!)