Java подключение к oracle

Обновлено: 06.07.2024

CLASSPATH=C:\app\client\oracle\product\12.1.0\client_1\jdbc\lib\ojdbc6.jar;C:\app\client\oracle\product\12.1.0\client_1\jlib\orai18n.jar;.
Path=C:\app\client\oracle\product\12.1.0\client_1\bin;C:\Program Files\Java\jdk1.8.0_25\bin;


TestDBOracle.java

public class TestDBOracle

public static void main(String[] args)
throws ClassNotFoundException, SQLException

//jdbc драйвер можно зарегистрировать так:
Class.forName("oracle.jdbc.driver.OracleDriver");
// или так:
// DriverManager.registerDriver(new oracle.jdbc.OracleDriver());


// Для подключения можно использовать тонкий драйвер
//jdbc:oracle:thin:@//host:port/service
String url = "jdbc:oracle:thin:@//alpha:1521/testdb_p.localdomain";
// или драйвер OCI
// String url = "jdbc:oracle:oci:@//alpha:1521/testdb_p.localdomain";
// Причем для обоих драйверов вместо //host:port/service , можно указать так:
// String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=alpha.localdomain)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=testdb_p.localdomain)))";
// Для кластера так:
// String url = "jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=yes)(ADDRESS=(PROTOCOL=TCP)(HOST=NODE1-VIP)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=NODE2-VIP)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORARAC)))";


Connection conn = DriverManager.getConnection(url,"scott","tiger");

conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery("select BANNER from SYS.V_$VERSION");
while (rset.next()) System.out.println (rset.getString(1));
>


C:\project\java>java TestDBOracle

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
CORE 12.1.0.2.0 Production
TNS for Linux: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production
Success!

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 имеют следующий вид:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Общение программ на Java с данными в БД под управлением Oracle осуществляется двумя основными способами: через JDBC и через SQLJ.

Использование JDBC

JDBC и JDBC-драйверы

JDBC - это Java API (Application Program Interface) для доступа из Java-программ к SQL-СУБД разных типов. Подразумевается, что одна и та же Java-программа сумеет с помощью JDBC реально работать в среде Windows с данными mySQL или же в среде Solaris с данными Informix. Она же может быть хранимой процедурой в БД под Oracle и работать с данными той же Oracle или, к примеру, Sybase.

Реализуется JDBC в виде интерфейсов java.sql (основной) и javax.sql (расширенный). Конкретный набор классов, реализующий JDBC-интерфейс и осуществляющий доступ к конкретной СУБД, называется драйвером. JDBC-драйверы для своих СУБД поставляют все основные разработчики.

Описаниями JDBC определено четыре типа JDBC-драйверов: два "тонких" и два "толстых".

  • Соединительный драйвер JDBC (тип I, "толстый")
  • "Родной" API-драйвер (тип II "толстый")
  • Общий сетевой API-драйвер (тип III "частично тонкий")
  • Драйвер прямого доступа через разъем (тип IV "тонкий")

JDBC-драйверы в Oracle

Фирма Oracle поставляет для работы со своей СУБД следуюшие драйверы, удовлетворяющие спецификациям JDBC:

  • тонкий (thin; тип IV, для работы извне, через браузер, по TCP/IP)
  • толстый (thick; тип II, для локальной работы извне)
  • родной (тип II, для работы изнутри, из хранимых в БД Java-процедур)

Помимо этого около сотни разных фирм поставляют JDBC-драйверы собственной реализации типов I, II, III и IV, в том числе и для связи с Oracle. Они доступны в интернете.

Установка JDBC-драйверов для работы с Oracle

Для работы с драйверами нужно добавить путь к этим файлам к переменной среды окружения CLASSPATH.

Файл Java-программы для проверки связи через JDBC

Для следующих ниже примеров организации разных вариантов связи с БД через JDBC нужно подготовить файл StaffByJDBC.java с общим для всех примеров текстом:

import java.sql.*;
import oracle.jdbc.driver.*;

public class StaffByJDBC
public static void main(String[] args)
String url = null;

if (args.length > 0) if (args[0].compareToIgnoreCase("thin") == 0) url = "jdbc:oracle:thin:@localhost:1521:TEACHER";
>
else if (args[0].compareToIgnoreCase("oci") == 0) url = "jdbc:oracle:oci8:@TEACHER";
>
else if (args[0].compareToIgnoreCase("kprb") == 0) url = "jdbc:oracle:kprb:";
>
>

if (url == null) System.out.println("usage: StaffByJDBC [thin/oci]");
return;
>

try DriverManager.registerDriver (
new oracle.jdbc.driver.OracleDriver());
>
catch (Exception e)

try Connection cn =
DriverManager.getConnection (url,"scott","tiger");

Statement st = cn.createStatement();
ResultSet rs =
st.executeQuery ("SELECT empno, ename FROM emp");

while ( rs.next() ) System.out.println("Number " +
"Name All that happened"); >
>
>

Работа с данными Oracle из внешних Java-программ

Работа с Oracle через тонкий драйвер

Трансляция и запуск программы (среда Unix - аналогично):

java StaffByJDBC thin

Работа с Oracle через толстый OCI-драйвер

Трансляция и запуск программы (среда Unix - аналогично):

java StaffByJDBC oci

Работа с данными Oracle из хранимых Java-программ

Обращение к БД из хранимых процедур

Загрузка, трансляция и запуск программы:

loadjava -user scott/tiger -oci8 -r StaffByJDBC.java

SQL> ALTER JAVA SOURCE "StaffByJDBC" COMPILE;

SQL> ALTER JAVA CLASS "StaffByJDBC" COMPILE;

SQL> CREATE OR REPLACE PROCEDURE liststaff (drivertype IN VARCHAR2)
AS LANGUAGE JAVA
NAME 'StaffByJDBC.main (java.lang.String[])';
/

SQL> EXEC liststaff('kprb')

PL/SQL procedure successfully completed.

Просмотр результатов - в трассировочном файле в каталоге ОС udump.

Особенности работы с kprb-драйвером

Работа с kprb-драйвером имеет свои отличия по отношению к работе со внешними драйверами:

  1. для хранимых программ явного подсоединения с БД не требуется - kprb-драйвер выполняет его неявно автоматически (код явного соединения из программ, написанных из расчета на внешнее соединение, будет проигнорирован)
  2. так как драйвер kprb не поддерживает AUTOCOMMIT, выполнять COMMIT или ROLLBACK в программе нужно явно
  3. устройством выдачи Sys.output по умолчанию является для kprb не экран, а трассировочные файлы в каталоге udump

Обращение к данным из триггеров Oracle

Специальных Java-триггеров в Oracle нет, и поэтому организация триггера на Java требует заведения внешней "оболочки" на PL/SQL, внутри которой делаются обращения к процедурам на Java, опубликованным для PL/SQL.

Вот как это может выглядеть:

CREATE TRIGGER scott.salary_check
BEFORE INSERT OR UPDATE OF sal, job ON scott.emp
FOR EACH ROW
WHEN (new.job <> 'PRESIDENT')
CALL check_sal(:new.job, :new.sal, :new.name);
/

Здесь CHECK_SAL должна быть опубликованной процедурой на Java.

Взаимодействие с базой данных через SQLJ

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

Подобно Java-программам с JDBC, программы с SQLJ могут работать как на клиенте, так и на сервере.

Пример программы с использованием SQLJ

Типовой пример программы с использованием SQLJ (файл StaffBySQLJ.sqlj ):

Транслирование программы с SQLJ

Пример транслирования программы с SQLJ:

SET CLASSPATH=%ORACLE_HOME%\jdbc\lib\classes12.zip;.
SET CLASSPATH=%CLASSPATH%;%ORACLE_HOME%\sqlj\lib\translator.zip
SET CLASSPATH=%CLASSPATH%;%ORACLE_HOME%\sqlj\lib\runtime12.zip

После этого в текущем каталоге появятся файлы (вариант версии 8.1.7):

StaffBySQLJ.class
StaffBySQLJ.java
StaffBySQLJ _SJProfile0.ser
StaffBySQLJ _SJProfileKeys.class
MyIter.class

Таким образом, программа sqlj не только предтстранслирует исходный яайл SQLJexample.sqlj, но и странслирует вслед порожденную ею же программу SQLJexample.java с учетом подготовленных свойств. Запуск конечного результата выглядит как обычно:

Более сложный пример транслирования:

sqlj -user=scott/tiger@jdbc:oracle:thin:@localhost:1521:teacher StaffBySQLJ.sqlj

Транслирование программ с SQLJ, предназначенных для исполнение на сервере, можно осуществлять

(а) явно (программа sqlj, как показано выше) с последующей загрузкой классов в БД (в этом случае их перед загрузкой удобно объединять в jar-файлы)
(б) неявно, путем загрузки файлов .sqlj в БД (автоматическая предтрансляция будет в этом случае выполнена.внутренними средствами Oracle).

Выполнение программы с SQLJ

Для возможности обращения программы c SQLJ, загруженной с помощью loadjava из jar-файла (или напрямую), можно выполнить

CREATE OR REPLACE PROCEDURE my_sqlj_example
AS LANGUAGE JAVA
NAME 'StaffBySQLJ.main(java.lang.String[])';

Программы с SQLJ, написанные для работы с БД извне (с клиентской стороны), всегда будут работоспособны и в качестве хранимых программ (то есть, на сервере). Обратное не обязательно верно (см. комментарий по поводу особенностей использования kprb-драйвера выше).


В этом уроке я бы хотел вас научить работать с базами данных MySQL, PostgreSQL, Oracle. А именно как подключится и выполнять SQL запросы к базе с помощью java.

Что такое JDBC?

Зачем нужен JDBC?

jdbc_scheme

Шаг 1.

Скачиваем jar файл JDBC драйвера.

Шаг 2.

Подключение к БД Mysql:

Подключение к БД PostgreSQL:

Подключение к БД Oracle:

В 1-й строке мы указываем наш JDBC драйвер. Не забудьте добавить его в ClassPath иначе его компилятор его не увидит.
Во 2-й строке JDBC Manager который открывает соединение с базой данных и обеспечит нам дальнейшее обращение к ней.
И последняя строка закрывает соединение с БД.

Желательно строку для определения JDBC поместить в блок try для того чтобы контролировать его наличия в вашем приложении.

Шаг 3. Создание таблиц в БД.

Вынесем в отдельный метод соединение с БД.

Этот метод будет создавать в БД таблицу:

и в main методе вызываем метод createDbTable() который создаст таблицу в БД.

В результате вы должны получить:

Шаг 4. Добавление новой записи в БД.

метод который будет возвращать текущую дату и время:

И выполняем наш SQL запрос который лежит в переменной insertTableSQL

Шаг 5. Получение данных с БД.

Шаг 6. Удаление данных с БД.

Выполняем запрос на удаление:

Шаг 7. Обновление данных в БД.

Выполняем запрос на обновление записи:

Выводы.

Все действия с любой базой данных выполняются через SQL запросы, то есть нам достаточно знать SQL для манипуляцией данными в БД.

ПОХОЖИЕ ПУБЛИКАЦИИ

29 комментариев к статье "Работа с базами данных с помощью JDBC драйвера"

При этом файл postgresql-9.2-1002.jdbc4.jar лежит в /libs

И в classpath добавлять пробовал, хотя многие источники говорят, что это не обязательно, достаточно держать файл postgresql-9.2-1002.jdbc4.jar в /libs

Читайте также: