ТРЕНДСЛЕДЯЩАЯ МЕХАНИЧЕСКАЯ ТОРГОВАЯ СИСТЕМА 
на валютном рынке FOREX, генерирующая торговые сигналы с применением современных математических методов. Позволяет обрести уверенность в принятии Вами торговых решений.
Подробнее: www.forex-gold.com.ru  

реклама у нас

***

Метод обновления данных в Internet-магазине. Часть 2

Евгений Вересов <veresov@com.psc.ru>

В первой части статьи были сформулированы требования к программе.

Программа должна:

1. Cчитывать данные из локальной БД Access, передавать иx через Internet на сервер и там записывать в базу данных MySQL. Все эти функции должны выполняться автоматически, в обязанности оператора входит лишь инициация процесса.

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

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

Технология реализации второй части задачи

Известно, что с клиентской машины на сервер, в Servlet на исполнение может быть отправлен любой SQL-оператор, например:

- SELECT;

- UPDATE;

- INSERT;

- DELETE;

................

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

После выполнения SQL-оператора Servlet извещает клиентское приложение. Для одних SQL-операторов - это признак нормального завершения операции либо код ошибки, для других, как, например, для SELECT - это еще и считанные данные. Рассмотрим алгоритм реализации задачи.

Алгоритм реализации просмотра данных.

Последовательность действий такова:

- сформировать оператор SELECT;

- передать сформированный оператор через Internet на исполнение Servlet;

- Servlet должен принять оператор, подключиться к MySQL, выполнить принятый SQL-оператор, передать данные клиентскому приложению;

- клиентское приложение должно принять от Servlet содержимое запроса и отобразить его в объекте класса JTable.

Какие данные может запросить пользователь? Это может быть полное или частичное содержание одной или группы таблиц БД MySQL. Запросы могут быть предопределены приложением. Однако в общем случае пользователь может запросить любые данные.

Поэтому упростим ситуацию и будем считать, что запрос набран пользователем в объекте класса JTextArea и считан в программе командой:

String query = jTextArea.getText();

где,

JTextArea jTextArea.

Но вы скажете, что пользователь не обязан знать язык SQL-запросов, и будете абсолютно правы. Запрос можно формировать с помощью меню, checkbox и других полезных компонентов, но это определяется требованиями конкретного приложения.

Следующий шаг состоит в том, чтобы передать оператор на сервер.

Как передать запрос, содержащий SQL-оператор на сервер, подробно описано в пунктах 4-6 первой части статьи, и автор просит заинтересованного читателя обратиться туда. Предположим, что запрос благополучно доставлен в Servlet и ждет своей реализации.

Подключимся к базе данных, выполним оператор SELECT, сформируем данные, отправим их клиенту.

В литературе (2) предлагается к использованию пара замечательных классов DBResults и DBResultsTableModel, а также методика их применения. Автор ввел дополнительный конструктор и метод в класс DBResults и задействовал их в своем приложении.

Итак, Java текст Servlet, реализующий запрос клиентского приложения:

1. Подключимся к базе данных MySQL:

Class.forName(driver);

Connection connection = DriverManager.getConnection(url, username, password);.

где,

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

String url = "jdbc:mysql://" + host + "/" + dbName;

String host, dbName, username, password;

2. Создадим объект класса DatabaseMetaData и получим данные о MySQL:

DatabaseMetaData MySQLMetaData = connection.getMetaData();

String dbName = MySQLMetaData. getDatabaseProductName();

String dbVersion = MySQLMetaData. getDatabaseProductVersion();

3. Создадим объект класса Statement и выполним присланный оператор SELECT:

Statement statement = connection. createStatement();

ResultSet resultSet = statement.executeQuery(query);

4. Создадим объект класса ResultSet MetaData и найдем количество и имена столбцов в считанных данных:

ResultSetMetaData resultsMetaData = resultSet.getMetaData();

Количество столбцов:

int colCount = resultsMetaData. getColumnCount();

Массив имена столбцов:

String[] colNames = new String[col Count];

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

colNames[i] = resultsMetaData.getColumn Name(i+1).trim();}

5. DBResults MySQLResults = new DBResults(connection, dbName, dbVersion,

colCount, colNames);

6. Сформируем MySQLResults:

while(resultSet.next())

{

String[] row = new String[colCount];

for(int i=1; i<colCount+1; i++)

{

String entry = resultSet.getString(i);

I f (entry != null)

{

entry = entry.trim();

}

row[i-1] = entry;

}

MySQLResults.addRow(row);

}

7. Создадим выходной поток:

ObjectOutputStream pout = new ObjectOutputStream(response.getOutput Stream());

8. Отправим считанные данные клиентскому приложению:

pout.writeObject(MySQLResults);

9. Закроем поток.

pout.flush();

pout.close();

Работа Servlet на этом завершена.

Теперь дело за клиентским приложением - надо принять и отобразить данные. Делается это так:

1. Откроем входной поток и примем данные:

ObjectInputStream in= new ObjectInputStream(con.getInput

Stream());

DBResults. MySQLresults = (DBResults)in.readObject();

где con - объект класса URLConnection, созданного при передаче запроса на сервер;

2. Отобразим результат запроса в таблице:

DBResultsTableModel model = new DBResultsTableModel(MySQLresults);

table.setModel(model);

table.updateUI();

где table объект класса JTable;

Работа клиентского приложения на этом завершена.

Корректировки данных

Как нетрудно предположить, для изменения данных в серверной БД автор предлагает использовать SQL-операторы:

- DELETE;

- UPDATE;

- INSERT.

Эти операторы определяются пользователем клиентского приложения, пересылаются Servlet на исполнение, выполняются там, а результат возвращается в приложение.

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

А вот выполнять в Servlet их нужно таким образом:

DatabaseMetaData MySQLMetaData = connection.getMetaData();

Statement statement = connection.createStatement();

ResultSet resultSet = statement.executeQuery(query);

DBResults MySQLResults = new DBResults(0);

где query - SQL-оператор.

При возникновении ошибки происходит исключение. Код ошибки передается клиентскому приложению в составе объекта класса DBResults и считывается методом int getError().

Выводы

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

Но нет спокойствия в стане Linux/Apache/Tomcat/Java. "Проклятые" конкуренты из страны Win32/IIS/MS SQL/Visual C++ выделение/копирование/вставку в базу данных выполняют парой щелчков мышью, а запрос формируют с помощью визуальных средств. И они правы, не царское это дело - пользователю с SQL-операторами работать. Но вот как это реализовать в Java - тема отдельной статьи.

Литература

1. Патрик Ноутон, Герберт Шилдт. JAVA 2. Пер. с анг. СПб.: БХВ-Петербург. 2000.

2. М. Холл. Сервлеты и JavaServer Pages. Библиотека программиста. СПб. : Питер 2001.

Источник: http://www.comprice.ru/
   


Copyright © "Internet Zone"info@izcity.com 
Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone", как на источник получения информации. При этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izcity.com/.
При наличии у копируемого материала авторов и источника информации - их также нужно указывать, наряду со ссылкой на нас. Подробнее условия использования материалов смотрите здесь.