Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД / КР_БД_4семестр.doc
Скачиваний:
23
Добавлен:
10.02.2016
Размер:
357.38 Кб
Скачать

3.Программная реализация.

Доступ к базам данных на стороне клиента. Java-технология

Языком программирования для написания оболочки созданной базы данных был выбран язык Java по ряду причин.Во-первых, Java - это современный объектно-ориентированный язык программирования для разработки приложений, созданный специально для распределенных сред. Технология Java позволяет создавать полноценные приложения для работы с компьютерной графикой, файловыми системами и компьютерными сетями.

Одно из важных свойств Java-технологии - это мобильность, суть которой заключается в том, что написанный на Java код может исполняться на любой компьютерной платформе. Java-приложения компилируются в особый код (так называемый байт-код), исполняемый на виртуальной машине (Java Virtual Machine). Байт-код является универсальным форматом программы, единым для всех аппаратных платформ - и для рабочих станций, и для больших универсальных ЭВМ, и для персональных компьютеров. Java-технология обеспечивает быстрый цикл компиляции и отладки программ. Еще на стадии компиляции проводится выявление многих ошибок и частичная оптимизация программ. Средства разработки, содержащие виртуальную машину внутри себя, обеспечивают контроль приложений на стадии исполнения (переполнение стека, отслеживание границ массивов, поиск резервов для оптимизации и др.).

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

Для взаимодействия Java-приложения с внешним сервером баз данных разработан специализированный протокол JDBC, который, фактически, сочетает функции шлюзования между интерпретатором мобильных Java-кодов и интерфейсом ODBC (Open Data Base Connectivity). JDBC - это разработанный JavaSoft прикладной программный SQL интерфейс API JDBC к базам данных. Этот API позволяет использовать стандартный набор процедур высокого уровня для доступа к различным БД.

JDBC базируется на интерфейсе уровня вызовов X/Open SQL CLI - основе ODBC. Прикладной программный интерфейс JDBC реализуется поверх других SQL-API, включая ODBC. То есть, все базы данных, допускающих работу с ODBC, будут взаимодействовать с JDBC без изменений. При использовании JDBC Internet-пользователи подключаются к Web-серверу и загружают HTML-документ с апплетом. Апплет выполняется на клиентской ЭВМ в среде браузера и устанавливает связь с сервером базы данных. Механизм связи с базами данных является классом Java.

Архитектура JDBC состоит из двух уровней: JDBC API, который обеспечивает связь между приложением и менеджером JDBC и драйвер JDBC API, который поддерживает связь между JDBC менеджером и драйвером (рис.3). Разработчики имеют возможность взаимодействовать напрямую с ODBC посредством моста JDBC-ODBC.

Рис.1. Схема взаимодействия Java-приложений с сервером БД

JDBC API представляет собой набор классов (пакет или package) для установки соединений с базами данных, создания SQL-выражений, обработки результатов. JDBC-драйвера могут быть написаны на Java и загружены как часть апплета или быть написаны используя "родной" код компьютера (как шлюз к существующим библиотекам СУБД API). Примером такого шлюза является JDBC-ODBC мост (JDBC-ODBC bridge). Он транслирует JDBC запросы в вызовы ODBC, что позволяет получить доступ к огромному множеству существующих ODBC драйверов.

Во-вторых, для разработки программы имеется бесплатная IDE Eclipse , имеющая очень много средств, позволяющих облегчить написание программы. В частности очень удобным является WISYWIG редактор для создания графической оболочки программы.

3.1.Соединение с базой данных.

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

public boolean setConn(String url,String user,String pass) {

URL = "jdbc:postgresql:"+ url;

username = user;

password = pass;

Conn();

return isConn;

}

public void Conn() {

/*загрузка драйвера*/

try {

Class.forName("org.postgresql.Driver");

} catch (Exception e) {

System.out.println("Failed to load JDBC driver.");

}

/*подключение*/

try {

con = DriverManager.getConnection(URL, username, password);

stmt = con.createStatement();

} catch (Exception e) {

System.err.println("problems connecting to " + URL);

getframe("problems connecting to " + e);

isConn = false;

}

}

3.2.Обзор основных методов.

Благодаря визуальному редактору есть возможность довольно быстро получить неплохой интерфейс. Исходный код для всех графических объектов генерирует сама среда, остается лишь наделить все объекты заданными свойствами.

Основными методами являются метод исполнения SQL-запроса:

private void execSQL(int mode) {

Conn();

try {

if(mode == 1){

rs = stmt.executeQuery(query);

}else{

stmt.executeUpdate(query);

}

} catch (Exception e) {

getframe("Ошибка записи в базу:" + e);

System.out.println(query);

}finally{

query = "";

CloseConn();

}

}

И метод получения результатов запроса(в случае их наличия):

private void getData(){

vkRow.clear();

try {

ResultSetMetaData rsmd1 = rs.getMetaData();

colCount = rsmd1.getColumnCount();

for (int i = 0; i < colCount; i++) {

vkRow.add(rsmd1.getColumnName(i+1));

}

rowCount = 1;

while (rs.next()) {

rowCount++;

for (int k = 0; k < colCount; k++) {

vkRow.add(rs.getObject(k + 1));

}

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

getframe("Не удалось получить данные"+e);

}

}

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

Для выборок запросы выглядят следующим образом:

Получение данных о телефонах:

public Vector seeTelefon() {

query = "select * from telefon " + parametr+" order by code";

execSQL(1);

getData();

return vkRow;

}

Удаление записи в телефонах:

public void delTelefon(String condition) {

query = "delete from telefon where " + condition;

execSQL(2);

}

Просмотр продаж:

public Vector seeProd() {

query = "select pr.no_nakladnoi , T.model , pr.price_prodaji , pr.kolichestvo , pr.data , pr.klient from prodaja pr ,telefon T where T.code=pr.code_telefon "+parametr;

execSQL(1);

getData();

return vkRow;

}

Просмотр поставщиков:

public Vector seePost(){

query = "select id_postavshika,name from postavshik ";

execSQL(1);

getData();

return vkRow;

}

Просмотр поставок:

public Vector seePostavki(){

query = "select pos.no_nakladnoi ,pos.data ,T.model,P.name ,pos.price_pokupki ,pos.kolichestvo from postavka pos,telefon T, postavshik P where (pos.code_telefon=T.code) and (P.id_postavshika=pos.postavshik)";

execSQL(1);

getData();

return vkRow;

}

Получение данных о выручке:

public Vector doxod(){

query = "select sum(kolichestvo*price_prodaji) AS доход from prodaja ";

execSQL(1);

getData();

return vkRow;

}

Выполнение вноса данных и их обновление сложнее, так как запрос необходимо генерировать:

Ввод данных в телефоны:

public void insTelefon(Vector<String> insData) {

query = "insert into telefon values (";

for (int i = 0; i < insData.size(); i++) {

if (i != insData.size() - 1) {

if (i == 0 || i == 4 || i == 11 || i == 12 || i == 15|| i == 16) {

query += insData.get(i) + ", ";

} else

query += "'" + insData.get(i) + "', ";

} else {

query += insData.get(i) + ")";

}

}

execSQL(2);

insData.clear();

}

Ввод данных в поставки:

public void insPostavka(Vector<String> insData) {

query = "insert into postavka values (";

for (int i = 0; i < insData.size(); i++) {

if (i != insData.size() - 1) {

if (i == 0 || i == 2 || i == 3 || i == 4 || i == 5) {

query += insData.get(i) + ", ";

} else

query += "'" + insData.get(i) + "', ";

} else {

query += insData.get(i) + ")";

}

}

execSQL(2);

insData.clear();

}

И пример обновления данных в телефонах:

public void updTelefon(Vector<String> insData) {

int i = 0;

query = "update telefon set ";

query += "code = "+insData.get(i++) + ", ";

query += "model = '"+insData.get(i++) + "', ";

query += "label = '"+insData.get(i++) + "', ";

query += "std_svyazi = '"+insData.get(i++) + "', ";

query += "weight = "+insData.get(i++) + ", ";

query += "razmer = '"+insData.get(i++) + "', ";

query += "interfaces = '"+insData.get(i++) + "', ";

query += "internet = '"+insData.get(i++) + "', ";

query += "ekran = '"+insData.get(i++) + "', ";

query += "camera = '"+insData.get(i++) + "', ";

query += "radio_fm = '"+insData.get(i++) + "', ";

query += "memory = "+insData.get(i++) + ", ";

query += "battery = "+insData.get(i++) + ", ";

query += "smartfon = '"+insData.get(i++) + "', ";

query += "garantija = '"+insData.get(i++) + "', ";

query += "price = "+insData.get(i++) + " , ";

query += "kolichestvo = "+insData.get(i++) + " ";

query += "where code = "+insData.get(0);

execSQL(2);

insData.clear();

}

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

public void actionPerformed(java.awt.event.ActionEvent e) {

outData = connection.seePostavki();

int rCnt = connection.rowCount;//ряды

int cCnt = connection.colCount;//столбцы

int indx =0;

jTable1 = new JTable(rCnt,cCnt);//создание табл.

jScrollPane1.setViewportView(jTable1);

//внос данных в ячейки

for (int i = 0; i < rCnt; i++) {

for (int j = 0; j < cCnt; j++) {

jTable1.setValueAt(outData.get(indx),i, j);

indx++;

}

}

}

});

Вся получаемая информация в программе хранится в векторах.

Также в программе находится множество методов и переменных обеспечивающих взаимодействие всех графических компонентов в соответствии с назначенными им функциями.

Соседние файлы в папке БД