13
Факультет «Информатика и системы управления»
Методические указания к лабораторной работе
по курсу «Распределенные системы обработки информации»
"Работа с базами данных"
Москва 2004 г.
Оглавление
Цель работы
1. Познакомиться с JDBC (Java DataBase Connectivity) 2.0 API.
2. Освоить классы Connection, DatabaseMetaData, Statement, ResultSet пакета java.sql.
3. Осовоить класс JTable из пакета javax.swing.
4. Применить полученные знания на практике
1. Что такое JDBC?
2. Как осуществляется соединение?
3. Что передается в стороке URL?
4. Что делает класс Statement?
5. Какие есть типы запросов и классы для их выполнения?
6. Для чего нужен класс ResultSet?
7. Как извлекаются данные из ResultSet?
8. Как связаны табличная модель (Table Model) и класс JTable?
1. Кен Арнольд, Джеймс Гослинг, Дэвид Холмс. Язык программирования Java™.
2. Официальный сайт Java - http://java.sun.com/ (есть раздел на русском языке с учебником).
3. Java™ 2 SDK, Standard Edition Documentation - http://java.sun.com/products/jdk/1.5/index.html.
4. Джеймс Гослинг, Билл Джой, Гай Стил. Спецификация языка Java (The Java Language Specification - http://www.javasoft.com/docs/books/jls/). Перевод на русский язык - http://www.uni-vologda.ac.ru/java/jls/index.html
5. Официальный сайт проекта Eclipse - http://www.eclipse.org/.
6. www.citforum.ru
// Устанавливаем соединение
Connection con = DriverManager.getConnection (
«jdbc:odbc:wombat», «login», «password»);
Statement stmt = con.createStatement();
// Выполняем запрос
ResultSet rs = stmt.executeQuery (
«SELECT a, b, c FROM Table1»);
while (rs.next())
{
int x = getInt («a»); // получаем результат
String s = getString («b»);
float f = getFloat («c»);
}
6.1 Класс Connection
Объект Connection представляет собой соединение с БД. Сессия соединения включает в себя выполняемые SQL_запросы и возвращаемые через соединение результаты. Приложение может открыть одно или более соединений с одной или несколькими БД.
String url = «jdbc:odbc:wombat»;
Connection con =
DriverManager.getConnection (url, «oboy», «12Java»);
6.2 Класс Statement
6.3 Класс CallableStatement
Объект CallableStatement предоставляет унифицированный способ вызова хранимых процедур в любой СУБД. Вызов процедуры осуществляется с помощью escape_синтаксиса в одной из двух форм: с результирующим параметром и без него. Результирующий параметр - это один из типов выходных (OUT) параметров, являющийся возвращаемым значением хранимой процедуры. Подробное описание работы с хранимыми процедурами см. в JDK.
6.4 ResultSet
java.sql. Statement stmt = conn.createStatement();
ResultSet r = stmt.executeQuery («SELECT a, b, c FROM Table1»);
while (r.next())
{
// Напечатать значения в текущей строке.
int i = r.getInt («a»);
String s = r.getString («b»);
float f = r.getFloat («c»);
System.out.println («ROW =» + i + «» + s +» " + f);
}
String s = rs.getString («title»);
String s = rs.getString(2);
Колонки нумеруются слева направо, начиная с 1. Имена колонок в вызове методов getXXX нечувствительны к регистру букв. Вариант с использованием имен колонок существует для того, чтобы пользователь задавал методам getXXX те же имена колонок, что он использует в запросе. Если выражение select не указывает имена колонок (например «select * from table1» или в случаях, когда колонка вычисляется) должны использоваться номера колонок. В этих случаях пользователь не может знать наверняка имена колонок.
Информацию о колонках в ResultSet можно получить с помощтю вызова ResultSet.getMetaData. Возвращаемый объект ResultSetMetaData содержит информацию о количестве, типах и свойствах колонок объекта ResultSet.
Если известно имя колонки, но не ее индекс, то для поиска номера колонки можно использовать метод findColumn.
Все следующие примеры даны для СУБД MySQL4.0.12 и драйвер MySQLODBC 3.51, для работы через ODBC API.
7.1 Установка ODBC_драйвера для работы с mySql
MySQLAB распространяет все свои программы под General Public License (GPL). Самую свежую версию MyODBC 3.51 (двоичные коды и исходные тексты) можно скачать с http://www.mysql.com/. Подробно о MySQLODBC рассказано на http://www.mysql.com/downloads/api-myodbc.html.
После устновки MySQLследует установить драйвер MySQLODBC 3.51.
Для установки MyODBC на Windows Вы должны скачать соответствующий дистрибутивный файл для Вашей операционной системы с http://www.mysql.com/downloads/api-myodbc.html, распаковать его и выполнить файл SETUP.EXE.
8.1 DSN
После установки MySql, MySQLODBC 3.51 и создания базы данных следует создать источник данных.
Источник данных идентифицирует путь для данных, который может включать сетевую библиотеку, сервер, базу данных и другие атрибуты. В нашем случае источник данных представляет собой путь к базе данных MySQL. Чтобы соединиться с источником данных, Driver Manager проверяет системный реестр Windows для получения специфической информации подключения.ODBC Driver Manager и MyODBC Drivers использует раздел системного реестра, созданный ODBC Data Source Administrator. Этот раздел содержит информацию относительно каждого источника данных и связанного с ним драйвера. Прежде, чем Вы сможете соединяться с источником данных, информация о подключении должна быть добавлена к системному реестру.
8.2 Настройка MyODBC DSN
Чтобы добавлять и конфигурировать источники данных, используйте ODBC Data Source Administrator. ODBC Administrator модифицирует информацию о подключениях к источникам данных. Поскольку Вы добавляете источники данных, ODBC Administrator модифицирует информацию системного реестра для них.
Чтобы открыть ODBC Administrator из Control Panel:
· Нажмите Start, укажите на Settings и щелкните Control Panel.
· На системах под Microsoft Windows 2000 дважды щелкните по Administrative Tools, а затем дважды щелкните по Data Sources (ODBC). На компьютерах под предыдущими версиями Microsoft Windows дважды щелкните по 32_bit ODBC или по ODBC.
Чтобы добавить источник данных в Windows:
1. Откройте ODBC Data Source Administrator.
2. В диалоговом окне ODBC Data Source Administrator нажмите Add. Откроется диалоговое окно Create New Data Source.
3. Выберите там MySQLODBC 3.51 Driver и нажмите на Finish. Появится диалоговое окно MySQLODBC 3.51 Driver - DSN Configuration.
4. В окне Data Source Name впечатайте имя источника данных, к которому Вы хотите обращаться. Это может быть любое имеющее силу имя, которое понравилось.
5. В окне Description введите описание необходимое для DSN.
6. В окне Host or Server Name (or IP) напечатайте имя сервера MySQL, к которому Вы хотите обращаться. По умолчанию это local host.
7. В окне Database Name укажите имя MySQLбазы данных, которая будет применяться как заданная по умолчанию база данных.
8. В окне User задайте имя пользователя базы данных (user ID).
9. В окне Password надо задать пароль.
10. В окне Port напечатайте номер порта, если это не значение по умолчанию 3306.
11. В окне SQL Command Вы можете вводить факультативную команду SQL, которую серверу надлежит выполнить сразу после установления подключения.
Теперь нажмите OK, чтобы добавить этот источник данных. Обратите внимание: при щелчке на OK диалоговое окно Data Sources dialog, и ODBC Administrator модифицирует информацию системного реестра. Имя пользователя и строка подключения станут заданными по умолчанию значениями подключения для этого источника данных. Вы можете также проверить, достаточны ли Ваши параметры настройки, чтобы соединиться с сервером, используя кнопку Test Data Source.
Чтобы изменить источник данных в Windows:
1. Откройте окно ODBC Data Source Administrator. Выберите соответствующую вкладку DSN.
2. Выберите источник данных MySQL, который Вы хотите изменить, а затем нажмите modify и щелкните по Configure. Откроется диалоговое окно MySQLODBC 3.51 Driver - DSN Configuration.
3. Измените соответствующие поля источника данных, а затем нажмите OK.
По умолчанию после установки драйвера MyODBC 3.51 в системе создается User DSN с именем myodbc3_test, который можно использовать, не создавая своих источников данных.
// Следующий код может использоваться в качестве шаблона.
// Просто надо заменить соответствующие URL, login, пароль, и
// SQL_выражения на требуемые в каждой конкретной задаче строки.
import java.net.URL;
import java.sql.*;
class SimpleSelect
{
public static void main (String args[])
{
String url = «jdbc:odbc:myodbc3_test»;
String query = «SELECT * FROM maildb.users»;
try
{
// Загружаем драйвер моста jdbc-odbc
Class.forName («sun.jdbc.odbc. JdbcOdbcDriver»);
DriverManager.setLogStream (System.out);
// Пытаемся соединиться с драйвером. Идет поиск
// хотя бы одного из зарегистированных
// драйверов, который может обработать этот URL
Connection con = DriverManager.getConnection (
url, «my-user», «my-passwd»);
// Если у нас не получится, то будет
// сгенерировано исключение. Т.о., если мы до сюда дошли,
// мы успешно соединились с URL
// Посмотрим, какие замечания были сгенерированы
// процедурой соединения. Выведем их.
checkForWarning (con.getWarnings ());
// Получить объект DatabaseMetaData и отобразить
// некоторую информацию об этом подключении
DatabaseMetaData dma = con.getMetaData ();
System.out.println («nConnected to» + dma.getURL());
System.out.println («Driver» + dma.getDriverName());
System.out.println («Version» + dma.getDriverVersion());
System.out.println(«»);
// Создаем объект Statement, чтобы можно было
// отсылать SQL_запросы к драйверу
Statement stmt = con.createStatement ();
// Отсылаем запрос, получаем объект
ResultSet rs = stmt.executeQuery (query);
// Показать все колонки и стороки из набора данных
dispResultSet (rs);
// Закрыть набор данных
rs.close();
// Закрыть оператор
stmt.close();
// Закрыть соединение
con.close();
}
catch (SQLException ex)
{
// Сгенерировалось исключение SQLException. Отловить его
// и отобразить информацию об ошибке.
// Заметим, что может быть несколько объектов ошибки,
// соединенных вместе в одну цепочку
System.out.println («n*** Поймали SQLException ***n»);
while (ex!= null)
{
System.out.println («SQLState:» + ex.getSQLState ());
System.out.println («Сообщение:» + ex.getMessage ());
System.out.println («Vendor:» + ex.getErrorCode ());
ex = ex.getNextException ();
System.out.println («»);
}
}
catch (java.lang. Exception ex)
{
// Получили ошибку другого типа. Распечатать ее.
ex.printStackTrace ();
}
}
// -
// checkForWarning
// Проверить, есть ли предупреждения, и отобразить их.
// Возвращает true, если предупреждение есть.
// -
private static boolean checkForWarning (SQLWarning warn)
throws SQLException
{
boolean rc = false;
// Если дан объект SQLWarning, отобразить
// сообщения о предупреждениях. Заметьте, что может быть
// несколько предупреждений, связанных в цепочку
if (warn!= null)
{
System.out.println («n *** Warning ***n»);
rc = true;
while (warn!= null)
{
System.out.println («SQLState:» + warn.getSQLState ());
System.out.println («Message:» + warn.getMessage ());
System.out.println («Vendor:» + warn.getErrorCode ());
System.out.println («»);
warn = warn.getNextWarning ();
}
}
return rc;
}
// -
// dispResultSet
// Отображает все колонки и строки в данном наборе данных
// -
private static void dispResultSet (ResultSet rs)
throws SQLException
{
int i;
// Получить ResultSetMetaData. Он нужен для
// получения загловков колонок
ResultSetMetaData rsmd = rs.getMetaData ();
// Взять количество колонок в наборе данных
int numCols = rsmd.getColumnCount ();
// Показать шапку
for (i=1; i<=numCols; i++)
{
if (i > 1) System.out.print(»,»);
System.out.print (rsmd.getColumnLabel(i));
}
System.out.println(«»);
// Показать все данные вплоть до конца набора данных
boolean more = rs.next ();
while (more)
{
// Для каждой колонки в цикле: получить
// ее значение и показать его
for (i=1; i<=numCols; i++)
{
if (i > 1) System.out.print(»,»);
System.out.print (rs.getString(i));
}
System.out.println(«»);
// Передвинуться на следующую строку набора данных
more = rs.next ();
}
}
}
Компонент JTable предназначен для отображения данных в виде таблицы.
JTable только отображает данные на экране компьютера. Класс, позволяющий работать с данными и метаданными таблицы, мы унаследуем от класса AbstractTableModel. Итак, каждая таблица берет данные из табличной модели.
13
10.1 TableModel
Создадим табличную модель следующим образом:
// Файл MyTableModel.java
import javax.swing.table. AbstractTableModel;
public class MyTableModel extends AbstractTableModel {
private String[] columnNames = { // Названия колонок
«#», «First name», «Last name», «Is Work»};
private Object[][] data = { // Данные
{new Integer(1), «Alexandr», «Fomichev», new Boolean(true)},
{new Integer(1), «Ivan», «Petrov», new Boolean(false)},
{new Integer(1), «Nikolay», «Ivanov», new Boolean(true)}};
public int getColumnCount() { // Выдает количество колонок
return columnNames.length;
}
public String getColumnName (int col) { // Выдает название колонки
return columnNames[col];
}
public int getRowCount() { // Выдает количество строк
return data.length;
}
public Object getValueAt (int row, int col) { // Выдает значение ячейки
return data[row] [col];
}
public Class getColumnClass (int col) { // Возвращает класс колонки
return data[0] [col].getClass();
}
public boolean isCellEditable (int row, int col) { // Возвращает, можно
if (col > 0) // ли редактировать ячейку
return true;
else
return false;
}
public void setValueAt (Object v, int row, int col) { // Установка нового значения
data[row] [col] = v;
fireTableCellUpdated (row, col);
}
}
Табличная модель унаследована от AbstractTableModel, мы обязаны переопределить следующие методы: getColumnCount, getColumnName, getRowCount, getValueAt. Остальные методы можно не переопределять. Метод getColumnClass нужен нам для того, чтобы отображать колонку «Is Work» в виде checkbox, если бы мы не определили бы этот метод, в ячейке было бы написано «true» или «false». Так как мы хотим редактировать нашу таблицу, нам необходимо еще два метода: isCellEditable и setValueAt. Обратите внимание на то, что в методе setValueAt мы сообщаем таблице, что значение изменено.
Теперь давайте отобразим нашу таблицу, используя только что созданную табличную модель.
10.2 Класс JTable
// Файл MyTable.java
import java.awt.*;
import javax.swing.*;
public class MyTable extends JFrame {
public MyTable() {
jbInit();
}
private void jbInit() {
MyTableModel _tm = new MyTableModel();
JTable _myTable = new JTable(_tm);
JScrollPane _scrollPane = new JScrollPane(_myTable);
this.setDefaultCloseOperation (EXIT_ON_CLOSE); // что делать при закрытии окна
this.getContentPane().setLayout (new BorderLayout());
this.getContentPane().add (_scrollPane, BorderLayout.CENTER);
}
public static void main (String[] args) {
MyTable t = new MyTable();
t.setSize (300,95);
t.show();
}
}
Мы создали таблицу, указав в качестве параметра нашу табличную модель. Сама таблица размещена в контейнере JScrollPane. Если бы мы не создали JScrollPane, то естественно не добавился бы скроллинг, и мы не увидели бы названий колонок.
Контрольная работа | Концепция информатизации Российской Федерации |
Контрольная работа | Причины агрессивного поведения. Методы работы с агрессивными детьми |
Контрольная работа | Алгоритм выбора и реализации предпринимательской идеи |
Контрольная работа | Современные методы арт-терапии |
Контрольная работа | Системы управления взаимоотношения с клиентами |
Контрольная работа | Учет материальных затрат в бухгалтерском учете |
Контрольная работа | Геополитическое положение России |
Контрольная работа | Особенности вознаграждения работников в организации |
Контрольная работа | Виды запасов |
Контрольная работа | Психоанализ |
Контрольная работа | Игра дошкольника |
Контрольная работа | Денежно-кредитная политика государства |
Контрольная работа | Автоматизированные информационные системы в экономике |
Контрольная работа | Ветеринарно-санитарная экспертиза на рынках |
Контрольная работа | Система линейных уравнений |