Java и базы данных

Цель занятия

Целью настоящего занятия является изучение механизма взаимодействия программы на языке Java и базы данных. Надлежит усвоить то, каким образом устанавливается соединение с базой данных с помощью подсистемы Администратор BDE, как подключается интерфейс JDBC-ODBC, как исполняются SQL- запросы. Сведения по языку SQL достаточно подробно изложены в [8, 10, 11]. Дополнительные сведения о работе с базой данных можно почерпнуть из [2, 10].

Краткие теоретические сведения

Работу с базами данньос выполняет подсистема JDBC (Java DataBase Connectivity). Имеется два основных варианта работы с базами данных. Первый вариант реализуется через взаимодействие с системой ODBC (Open DataBase Connectivity), сташей в некотором смысле ставдартом и реализованной в Windows. Система ODBC реализует множество различных драйверов для работы с широким диапазоном баз данных. Для работы с ODBC Java включает своего рода интерфейс JDBC-ODBC. Именно с этим вариантом работы мы познакомимся в этом практическом занятии. Второй вариант работы с базами данных состоит в подключении к ним "напрямую". Этот вариант работы мы не рассматриваем. Он реализован на основе ANSI SQU (American National Standards Institute SQL for Java — SQL для Java Американского национального института стандартов), а описание можно найти, например, в [10].

Для работы с базой данных в Java необходимо выполнить следующие действия. Подключить системный драйвер для работы с конкретной базой. Для этого выберите иконку My Computer (Мой компьютер) на рабочем столе, далее — пункт Control Panel (Панель управления). Затем выберите пункт Administrative Tools (Средства администрирования) и Data Sources ODBC (Источники данных ODBC). Теперь выберите вкладку System DSN (Системный DSN; DSN — Data Source Name), если создаете источник данных для многих пользователей и регистрируете его в реестре, либо User DSN (Пользовательский DSN), если создаете источник данных, доступный только на вашем компьютере. Появится окно администратора баз данных следующего вида (рис. 2.7).

Рис. 2.7. Окно администратора баз данных

В этом окне уже добавлены системные ODBC-драйверы для базы данных FoxPro и Access. Поскольку предполагается, что изначально этих установок нет, то выберите кнопку Add (Добавить).

Рис. 2.8. Создание источника данных

Затем двойным щелчком мыши выберите нужный драйвер из списка драйверов. Получите следующее окно (рис. 2.8).

В поле Data Source Name (Имя источника) введите, например, MSDE>; в поле Description (Описание) — mdb для Access (для FoxPro введите, соответственно, VFP или DBF — см. Замечание далее). Если собираетесь работать с конкретной базой данных, то она должна уже быть создана, и в этом случае нужно будет ввести название пути к ней. Закройте окна для установки драйверов. Данный пункт завершен.

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

Connection db=DriverManager.getConnection(url);

Здесь uri задает ссылку на драйвер базы данных. Переменная uri может быть объявлена так:

String url="jdbc:odbc:vfp"; —ZUraFOXPRO

ИЛИ

String url="jdbc:odbc:msdb"; — ZUraACCESS.

(__ Замечание )

Вы вовсе не обязаны использовать имена vfp и msdb для именования своих источников данных. Вопрос выбора имен — сугубо индивидуальное дело. В своем приложении вы можете назвать их иначе.

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

Для работы с базой данных потребуется вспомнить SQL для того, чтобы писать запросы, в том числе и запрос на создание таблицы. Это делается так:

Statement sq=db.createStatement(); // формируем пустую команду

// SQL

String sq_str="SELECT * FROM myt"; // Определяем строку

// запроса на выборку ResultSet rs= sq.executeQuery(sq_str); // Выполняем команду

// SQL

И это почти все. В приведенном примере сформирована строка запроса:

String sq_str="SELECT * FROM myt"; и выдана команда на его выполнение:

ResultSet rs=sq.executeQuery(sq_str);

Ясно, что переменная rs будет содержать все найденные записи. Для доступа к этим записям можно организовать следующий цикл:

while(rs.next ())

{

String s=rs.getString("Name");

System.out.println("my-"+s);}

System.out.println("OK");

Команда rs.next() выдает очередную запись и возвращает true или false в зависимости от того, достигнут конец набора или нет. Команда rs.getstring("Name") возвращает содержимое поля Name, которое должно иметь тип char (varchar). Для получения значений полей другого типа следует использовать следующие команды:

□      rs.getBoolean(HMH_cTcm6aa); // — для поля таблицы типа boolean

□      rs.getInt (имя_столбца) ; // — ДЛЯ ПОЛЯ таблицы ТИПа int

□      rs.getDate(MMH_cTon6aa); // — для поля таблицы типа Date

□      rs.getFloat(MMH_CTon6aa); // — ДЛЯ ПОЛЯ таблицы ТИПа Numeric

Далее (листинг 2.11) приведен полный текст программы, из которого все сказанное выше следует как само собой разумеющееся (хотя некоторые аспекты все еще нуждаются в комментариях).

! Листинг 2.11. Текст приложения для работы с базой данных

import java.awt.*; import java.net.*; import java.sql.*; public class lab6

public static void main(String args[])

String url="jdbc:odbc:vfp"; // Подключение источника данных

// vfp, подгоготовленного с помощью // администратора ODBC

try

{

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

} //нуждается в комментарии catch(Exception e)

{

System.out.println("Classdefnotfound"+e);

try

{

// Объявление соединения с источником данных:

Connection db=DriverManager.getConnection(url);

Statement sq=db.createStatement();// Создаем пустую

// команду SQL // Строка запроса на выборку данных:

String sq_str="SELECT * FROM myt";

ResultSet rs= sq.executeQuery(sq_str); // Переменная rs

// получает набор // выбранных записей

while(rs.next())

{ //Выполняем просмотр записей набора:

String s=rs.getString("Name"); // Получаем содержимое

// поля Name текущей // записи

System.out.println("my-"+s); // Выводим содержимое поля

// Name на консоль

}

System.out.println("OK") ;

// db.close(); // Эта строка не является необходимой // Но все же рекомендуется закрывать базу после // завершения работы

}

catch(Exception er)

{

System.out.println("Error has arised here:"+er);}

}

}

Дадим дополнительные комментарии к программе. Строка:

Class.forName("sun.j dbc.odbc.JdbcOdbcDriver");

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

<Команда> <Таблица> <Данные>

Основными комавдами являются следующие:

□      создание таблицы (cREATE tabie);

□      удаление таблицы (DROP tabie);

□      вставка записи в таблицу (iNSERT into);

□      обновление таблицы путем изменения данных (uPDATE);

□      выборка записей по условию (звьЕст).

Условия задаются с помощью ключевого слова where, после которого записывается простое или сложное логическое условие, например:

where age>2 0 (выбор записей, где поле age больше 20), или

where (age>20) and (age<40) (выбор записей, где llO.ie age больше 20 и меньше 40), или

where not(name="Ivanov") (выбор записей, где llO.ie name не содержит слово "ivanov") и т. д.

Пример создания таблицы:

CREATE table MYTABLE (Name char(50), Age int(3), Location varchar(20))

В этом примере создается таблица по имени MYTABLE, состоящая из полей Name, Age и Location. Для каждого поля при создании указывается тип. Для поля Name указан строковый тип фиксированной длины (char (50)); для поля Age — целочисленный тип с тремя значащими цифрами; для поля Location — строковый тип переменной длины (первоначальная длина составляет 20 символов). Наряду с указанными выделим другие типы данных SQL:

□      Date (дата);

□      Numeric (m,n) (вещественный тип с фиксированной точкой; m определяет общее число разрядов, а n — число разрядов после запятой);

□      Float (вещественный с плавающей точкой);

□      DateTime (дата и время);

□      Biob (большие двоичные наборы данных).

Пример удаления таблицы:

DROP table MYTABLE Вставка записи в таблицу:

INSERT INTO MYTABLE VALUES("Jan",14 0, "Paradise")

Данные изменяются в таблице запросом:

UPDATE MYTABLE SET LOCATION="Paradise" WHERE AGE>110 Запись удаляется из таблицы запросом:

DELETE FROM MYTABLE WHERE AGE>110

Осуществим выборку записей, у которых значение поля LOCATION принадлежитмножествуг’минск", "Куйбышев", "Гродно"}:

SELECT * FROM MYTABLE WHERE

LOCATION IN("Минск","Куйбышев","Гродно")

Для формирования упорядоченного результирующего набора используется ключевое слово ORDER BY, за которым указываем имя столбца, по которому выполняется упорядочение записей:

SELECT * FROM MYTABLE WHERE

LOCATION IN("Минск","Куйбышев","Гродно") ORDER BY Location

Подробности о языке SQL можно найти в [8].

Интерес представляет чтение полей, в которых хранятся картинки. Такие поля описываются с типом Biob. Например, при создании таблицы средствами языка SQL, одно из полей которой должно содержать рисунок, следует ввести команду следующего типа:

CREATE table MYTABLE (Name char(50), Age int(3), Photo blob(64k))

Для выборки объектов Biob следует использовать команду getBiob (). Приведем короткий фрагмент, который прояснит суть вопроса:

Label lb=new Label();

rs= s.executeQuery("Select * from MYTABLE""); if (rs.next())

{

Blob Ы =rs.getBlob(3);

// 3 — номер поля в заголовке таблицы с рисунком byte [ ] imgbytes = blob.getBytes(l,60*60);

// картинка имеет размер 60*60 пикселов lb.setIcon(new ImageIcon(imgbytes));

}

Таким образом, предварительно созданную базу данных с картинками можно просто просматривать, как показано выше.

В приведенном приложении (листинг 2.9) использовалась команда executeQuery(), которая позволяла построить набор записей по запросу SELECT. Для выполнения других запросов SQL (например, CREATE или UPDATE) следует использовать команду execute (). Следующий фрагмент кода поясняет ситуацию.

Statement sq=db.createStatement(); // Создаем пустую команду

// SQL

String sq_str="Create table myt(Name char(20), Age int(3), Location char(30))

sq.execute(sq_str); // Выполнение запроса на создание таблицы Разумеется, никакого результирующего набора при выполнении таких запросов не создается.

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100