Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Драйверы, соединения с базой данных и запросы

JDBC (Java DataBase Connectivity) – стандартный прикладной интерфейс (API) языка Java для организации взаимодействия между приложением и СУБД. Это взаимодействие осуществляется с помощью драйверов JDBC, обеспечивающих реализацию общих интерфейсов для конкретных СУБД и конкретных протоколов.

В JDBC определяются четыре типа драйверов:

1. Драйвер, использующий ODBC прикладной интерфейс взаимодействия с СУБД (так называемый JDBC-ODBC – мост, см. рисунок 1). Стандартный драйвер первого типа sun.jdbc.odbc.JdbcOdbcDriverвходит в JDK.

Рис.1 Доступ к БД с помощью JDBC-ODBC моста

 

2. Драйвер, работающий через внешние (native) библиотеки (т.е. СУБД клиента).

3. Драйвер, работающий по сетевому и независимому от СУБД протоколу с промежуточным Java-сервером, который, в свою очередь, подключается к нужной СУБД.

4. Сетевой драйвер, работающий напрямую с нужной СУБД и не требующий установки native-библиотек.

Предпочтение естественным образом отдается второму типу, однако если приложение выполняется на машине, где не предполагается установка клиентской СУБД, то выбор производится между третьим и четвертым типами. Причем четвертый тип работает напрямую с СУБД по ее протоколу, поэтому можно предположить, что драйвер четвертого типа будет более эффективным по сравнению с третьим типом с точки зрения производительности. Первый же тип, как правило, используется в тех случаях, когда у СУБД нет своего драйвера JDBC, зато есть драйвер ODBC.

JDBC предоставляет интерфейс для разработчиков, использующих различные СУБД. С помощью JDBC отсылаются SQL-запросы только к реляционным базам данных (БД), для которых существуют драйверы, знающие способ общения с реальным сервером базы данных.

Строго говоря, JDBC не имеет прямого отношения к J2EE, но так как взаимодействие с СУБД является неотъемлемой частью Web-приложений, то эта технология нами рассматривается.

Последовательность действий разработчика приложений для связи с БД:

1.Загрузка класса драйвера базы данных при отсутствии экземпляра этого класса.

Например:

String driverName = "org.gjt.mm.mysql.Driver";

дляСУБД MySQL,

String driverName = "sun.jdbc.odbc.JdbcOdbcDriver";

дляСУБД MSAccess или

String driverName = "org.postgreesql.Driver";

для СУБД PostgreeSQL.

 

После этого выполняется собственно загрузка драйвера в память:

Class.forName(driverName);

и становится возможным соединение с СУБД.

Эти же действия можно выполнить, импортируя библиотеку и создавая объект явно. Например, для СУБД DB2 от IBM объект-драйвер можно создать следующим образом:

new com.ibm.db2.jdbc.net.DB2Driver();

2.Установка соединения с БД.

Для установки соединения с БД вызывается статический метод getConnection()класса DriverManager. В качестве параметров методу передаются URL базы данных, логин пользователя БД и пароль доступа. Метод возвращает объект Connection. URL базы данных, состоящий из типа и адреса физического расположения БД, может создаваться в виде отдельной строки или извлекаться из файла ресурсов. Например:

Connection cn = DriverManager.getConnection( "jdbc:mysql://localhost/my_db", "root", "pass");

В результате будет возвращен объект Connectionи будет одно установленное соединение с БД my_db. Класс DriverManagerпредоставляет средства для управления набором драйверов баз данных. С помощью метода registerDriver()драйверы регистрируются, а методом getDrivers()можно получить список всех драйверов.

3.Создание объекта для передачи запросов.

После создания объекта Connectionи установки соединения можно начинать работу с БД с помощью операторов SQL. Для выполнения запросов применяется объект Statement, создаваемый вызовом метода createStatement()класса Connection.

Statement st = cn.createStatement();

Объект класса Statementиспользуется для выполнения SQLзапроса без его предварительной подготовки. Могут применяться также объекты классов PreparedStatementи CallableStatementдля выполнения подготовленных запросов и хранимых процедур. Созданные объекты можно использовать для выполнения запроса SQL, передавая его в один из методов executeQuery(String sql)или executeUpdate(String sql)или execute(String sql).

4.Выполнение запроса.

Результаты выполнения запроса помещаются в объект ResultSet:

ResultSet rs = st.executeQuery( "SELECT * FROM my_table");

//выборка всех данных таблицы my_table

Для добавления, удаления или изменения информации в таблице вместо метода executeQuery()запрос помещается в метод executeUpdate().

Универсальный метод выполнения запроса - execute().

5.Обработка результатов выполнения запроса производится методами интерфейса ResultSet, где самыми распространенными являются next()и getString(int pos)а также аналогичные методы, начинающиеся с getТип(int pos)(getInt(int pos), getFloat(int pos)и др.) и updateТип(). Среди них следует выделить методы getClob(int pos)и getBlob(int pos), позволяющие извлекать из полей таблицы специфические объекты (Character Large Object, Binary Large Object), которые могут быть, например, графическими или архивными файлами. Эффективным способом извлечения значения поля из таблицы ответа является обращение к этому полю по его позиции в строке.

При первом вызове метода next()указатель перемещается на таблицу результатов выборки в позицию первой строки таблицы ответа. Когда строки закончатся, метод возвратит значение false.

6.Удаление запроса и закрытие соединения:

rs.close(); cn.close();

 

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

 

Пример 1. Доступ к БД Access с помощью JDBC- ODBC моста ( класс JDBC-ODBCBridge) в OSWINDOWS, с использованием драйвера "sun. jdbc. odbc. JdbcOdbcDriver".

1. Создайте базу данных Access, содержащую 1-3 таблицы произвольной тематики, например, Магазин.mdb с таблицей Tovar следующей структуры:

Имя поля Тип данных Свойства поля
Tovar_ID Числовой Размер поля - целое Формат поля – основной Число десятичных знаков - 0 Обязательное поле - Да Ключевое
Tovar_Name Текстовый Размер поля – 25 Индексированное поле – Да (Допускаются совпадения)
Flag Логический Формат поля – Да\Нет Значение по умолчанию – Нет Описание – скоропортящийся товар
Storage_Life Числовой Значение по умолчанию: 5 Условие на значение: >=0 Сообщение об ошибке – значение должно быть >=0 Описание – срок хранения

 

2. Создайте через Администрирование->Источники данных (ODBC) системный DSN (Data Source Name), указав драйвером Microsoft Access (*.mdb). Имя – произвольное, например, “DSN_Samojlova”. Теперь можно использовать созданный DSN в тексте Java программы.

 

3. В среде Вашего Eclipse – проекта создайте новый пакет, например, Samojlova_Base, а в нем класс, который реализует доступ к Access – базе и выполняет SQL-оператор SELECT. Текст данного класса:

 

package Samojlova_Base;

import java.sql.*;

publicclass Asses_BD_SELECT {

publicstaticvoid main(String[]args)

{

Stringa,b,c,d;// Для полей записи

String dsn = "DSN_Samojlova";

String dbURL = "jdbc:odbc:" + dsn;

Try

{

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Connection con = DriverManager.getConnection(dbURL);

Statement s = con.createStatement();

s.execute("select * from Tovar");

ResultSet rs = s.getResultSet();

System.out.println("ТоварыизмагазинаСамойловойТ.А.");

while (rs.next()){

a = rs.getString(1);

b = rs.getString(2);

c = rs.getString(3);

d = rs.getString(4);

System.out.println(a + "/" + b + "/" + c + "/" + d);

}

s.close();

con.close();

}

catch (Exception err)

{

System.out.println( "Error: " + err );

}

}

}

4. Запустите и отладьте программу. Примерный результат ее работы:

 

5. Создайте в этом же пакете класс на обновление срока хранения товаров SQL - оператором UPDATE:

package Samojlova_Base;

import java.sql.*;

publicclass Asses_BD_UPDATE {

publicstaticvoid main(String[]args)

{

Stringa,b,c,d;// Для полей записи

String dsn = "DSN_Samojlova";

String dbURL = "jdbc:odbc:" + dsn;

Try

{

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Connection con = DriverManager.getConnection(dbURL);

Statement s = con.createStatement();

// обновляем срок хранения

s.execute("update Tovar set Storage_Life = Storage_Life + 2");

s.execute("select * from Tovar");

ResultSet rs = s.getResultSet();

System.out.println("ТоварыизмагазинаСамойловойТ.А.");

while (rs.next()){

a = rs.getString(1);

b = rs.getString(2);

c = rs.getString(3);

d = rs.getString(4);

System.out.println(a + "/" + b + "/" + c + "/" + d);

}

s.close();

con.close();

}

catch (Exception err)

{

System.out.println( "Error: " + err );

}

}

}

6. Запустите и отладьте программу. Примерный результат ее работы:

 

Пример 2. Доступ к БД PostGreSQL с помощью драйвера "org. postgresql. Driver".Создайте базу данных PostGreSQL, содержащую таблицы той же структуры, что и в примере 1, например, таблицу товаров вида:

 

  1. Поместите драйвер в папку Вашего Eclipse – проекта и создайте в пакете для БД новый класс, который реализует доступ к PostgreSQL – базе и выполняет SQL-операторы (SELECT, UPDATE и др.). Примерный текст класса:

 

packageMy_Base;

importjava.sql.*;

publicclassPostgre_BD {

publicstaticvoid main(String[] args) {

String a,b,c,d;

Try

{

String dname = "org.postgresql.Driver";

Class.forName(dname);

Connection con = DriverManager.getConnection

( "jdbc:postgresql://localhost/MAGAZIN","postgres","1");

Statement s = con.createStatement();

// обновляемсрокхранения

s.execute("update tovar set storage_life = storage_life + 1");

System.out.println( "Успешно соединилась с БД!!");

s.executeQuery("select * from tovar");

ResultSetrs = s.getResultSet();

// выводимнаконсольтовары

System.out.println("Товары из магазина Самойловой Т.А.");

while (rs.next()){

a = rs.getString(1);

b = rs.getString(2);

c = rs.getString(3);

d = rs.getString(4);

System.out.println(a + "/" + b + "/" + c + "/" + d);

}

//запрос - выбратьфирмы и вывевтинаконсоль

s.executeQuery("select * from firm");

ResultSet rsf = s.getResultSet();

System.out.println("ФирмымагазинаСамойловойТ.А.");

while (rsf.next()){

a = rsf.getString(1);

b = rsf.getString(2);

System.out.println(a + "/" + b);

 

}

// закрываемзапрос и разрываемсоединение с БД

s.close();

con.close();

}

catch (Exception err)

{

System.out.println( "Error: " + err );

}

 

}

 

}

 

Отладьте и протестируйте данный класс. Примерный результат запуска должен иметь вид:

Задание 1 (индивидуальное). Создайте в среде Access (PostGreSQL) базу данных по теме, предложенной преподавателем.

Разработайте в среде Eclipse класс для обновления таблицы этой базы с выводом результата обновления.

Задание 2Используя CREATETABLE, добавьте в базу данных новую таблицу. Пример SQL – операторасозданияновойтаблицы:

CREATE TABLE My_USER (USER_NAME CHAR(50), PASSWD CHAR(32));

Примечание: Зайдите в среду БД и убедитесь, что таблица создана.

Лабораторная работа №14 (Ч1)

Последнее изменение этой страницы: 2016-07-23

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...