71707

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

Лабораторная работа

Информатика, кибернетика и программирование

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

Русский

2014-11-11

378 KB

25 чел.

 38 -

Лабораторная работа 11

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

1. Цель работы

Целью работы является приобретение навыков работы с базами данных в программах на языке Java.  

  

2. Состав рабочего места

2.1. Оборудование: IBM-совместимый   персональный компьютер (ПК).

2.2. Программное обеспечение: операционная система Windows, Java 2 SDK версии 6.0 и выше, пакет NetBeans IDE 6.1.

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

3.1. Операции с данными в SQL

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

В Microsoft Jet SQL версии 4.0 определены следующие основные предложения для операций над данными:

  •  получение полей из базы данных (предложение SELECT);
  •  создание новой таблицы из существующей таблицы (предложение SELECT … INTO);
  •  добавление записей в таблицу (предложение INSERT… INTO);
  •  изменение значений полей в таблице (предложение UPDATE);
  •  удаление записей из таблицы (предложение DELETE).

3.1.1. Получение значений полей из базы данных

Семантика табличного выражения состоит в том, что на основе применения предложения SELECT с опцией FROM, а также последовательного применения разделов WHERE, GROUP BY и HAVING из заданных в разделе FROM таблиц строится некоторая новая результирующая таблица, порядок следования строк которой не определен и среди строк которой могут находиться дубликаты (т.е. в общем случае таблица-результат табличного выражения является мультимножеством строк).

3.1.1.1. Предложение SELECT

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

SELECT [предикат] { * | таблица.* | [таблица.]поле1 [AS псевдоним1] [, [таблица.]поле2 [AS псевдоним2] [, ...]]}

   FROM табличное-выражение [, ...] [IN внешняя-база-данных]

  { INNER | LEFT | RIGHT } JOIN таблица2 ON таблица1.поле1 оператор-сравнения таблица2.поле2

   [WHERE критерий-выбора]

   [GROUP BY список-полей-в-группах ]

   [HAVING групповой-критерий ]

   [ORDER BY поле-упорядочения1 [ASC | DESC ][, поле-упорядочения2 [ASC | DESC ]][, ...]]]... ]

   [WITH OWNERACCESS OPTION]

Предложение SELECT содержит следующие элементы:

Элемент

Описание

предикат

Одно из следующих ключевых слов, ограничивающих количество выбранных записей: ALL (все записи), DISTINCT (пропуск записей, содержащих дублированные записи в заданных полях),  DISTINCTROW (пропуск полностью дублированных записей) или TOP n [PERCENT](вывод первых n записей или, если указаноPERCENT, n процентов записей). По умолчанию, значение предиката равно ALL.

*

Выбираются все поля из заданной таблицы или таблиц.  

таблица

Имя таблицы, содержащей поля, для которых выбираются записи.  

поле1, поле2

Имена полей, содержащих получаемые данные.  

псевдоним1, псевдоним2

Имена, используемые как заголовки столбцов вместо действительных заголовков столбцов в таблице.

табличное-выражение 

Имя таблицы, сохраняемое имя запроса или составной результат запроса из INNER JOIN, LEFT JOIN или RIGHT JOIN.  

внешняя-база-данных

Имя базы данных, содержащей таблицы в табличном-выражении, если они не находятся в текущей базе данных.

оператор-сравнения

Один из операторов сравнения (=, <>, >, <, <= и >=).

критерий-выбора

Выражение для критерия, по которому происходит выбор данных. Критерий может содержать операции сравнения (=, <>, >, <, <= и >=), а также логические операции AND и OR.

список-полей-в-группах 

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

групповой-критерий

Выражение, определяющее, какие сгруппированные записи будут выведены.

поле-упорядочения1,

поле-упорядочения2 

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

Опция FROM задает имя таблицы или запроса, из которого берутся поля данных.

Результатом выполнения опции FROM является расширенное декартово произведение таблиц, заданных списком таблиц опции FROM. Расширенное декартово произведение (расширенное, потому что в качестве операндов и результата допускаются мультимножества) в стандарте определяется следующим образом:

Если табличное выражение содержит только опция FROM (это единственный обязательный раздел табличного выражения), то результат табличного выражения совпадает с результатом опции FROM.

Опция IN определяет внешнюю базу данных, из которой берется заданная в опции FROM таблица.

Опция INNER JOIN объединяет записи в таблице2  с записями в таблице1, заданными в опции FROM на основании заданного в опции ON критерия.

Опция LEFT JOIN включает все записи с первой (левой) из двух таблиц, даже если в соответствии с критерием ON не найдено  соответствующих записей для второй (правой) таблицы.

Опция RIGHT JOIN включает все записи со второй (правой) из двух таблиц, даже если в соответствии с критерием ON не найдено  соответствующих записей для первой (левой) таблицы.

Опция WITH OWNERACCESS OPTION дает возможность пользователю задать те же привилегии, что и владельцу запроса.

3.1.1.2. Раздел WHERE

Опция WHERE определяет критерий выбора, ограничивающий количество выводимых записей.

Вычисление раздела WHERE производится по следующим правилам: Пусть R – результат  вычисления раздела FROM. Тогда условие поиска применяется ко всем строкам R, и результатом раздела WHERE является таблица, состоящая из тех строк R, для которого результатом вычисления условия поиска является истина.

Поскольку SQL допускает наличие в базе данных неопределенных значений, то вычисление условия поиска производится не в булевой, а в трехзначной логике со значениями true, false и unknown (неизвестно). Для любого предиката известно, в каких ситуациях он может порождать значение unknown.

В SQL определены следующие предикаты условия поиска: предикаты сравнения, логические предикаты,  предикат BETWEEN, предикат IN, предикат LIKE, предикат NULL, предикат с квантором и предикат EXISTS.

Предикаты сравнения задают следующие операции: '=' – равно, '<>' – не равно, '>' – больше, '<' – меньше, '>=' – больше или равно, '<=' – меньше или равно.

Пример.

WHERE birthYear > '1970'

Логические предикаты определяют логические операции NOT (НЕ), AND (И) и OR (ИЛИ).

Пример.

WHERE birthYear > '1970' AND birthYear <= '1975'

Предикат BETWEEN имеет следующий синтаксис:

выражение  [NOT] BETWEEN условие1 AND условие2

Выражение "x BETWEEN y AND z" дает тот же самый результат, что и "x >= y AND x <= z".

Предикат IN определяется следующими синтаксическими правилами:

выражение  [NOT] IN подзапрос | список1[,…]

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

Значение предиката равно true в том и только в том случае, когда значение левого операнда совпадает хотя бы с одним значением списка правого операнда. Если список правого операнда пуст (так может быть, если правый операнд задается подзапросом), или значение "подразумеваемого" предиката сравнения x = y (где x – значение  арифметического выражения левого операнда) равно false для каждого элемента y списка правого операнда, то значение предиката IN равно false. В противном случае значение предиката IN равно unknown. По определению значение предиката "x NOT IN S" равно значению предиката "NOT (x IN S)".

Предикат LIKE в Microsoft Jet SQL версии 4.0, записываемый следующим образом:

выражение LIKE "шаблон" 

позволяет сравнивать выражение с заданным шаблоном. Шаблон может быть обычной строкой, например,  "abc" или содержать следующие элементы, используемые в регулярных выражениях:

  •  * – несколько любых символов;
  •  ? – одиночный символ;
  •  # – одиночная цифра;
  •  […] – заданный диапазон значений;
  •  [!…] – вне заданного диапазона значений.

Примеры.

1. abc* – строка "abc" и любая строка, начинающаяся с символов "abc".

2. abc? – строка, состоящая из четырех символов и начинающаяся с символов  "abc".

3. abc# – строки "abc0"   "abc9".

4. [a-z] – строчные буквы латинского алфавита;

5. [!0-9] – не цифры.

Предикат NULL описывается синтаксическим правилом:

спецификация-столбца IS [NOT] NULL

Этот предикат всегда принимает значения true или false. При этом значение "x IS NULL" равно true тогда и только тогда, когда значение x не определено. Значение предиката "x NOT IS NULL" равно значению "NOT x IS NULL".

Предикат с квантором имеет следующий синтаксис:

условие операция-сравнения ALL | SOME | ANY подзапрос

Обозначим через x результат вычисления арифметического выражения левой части предиката, а через S результат вычисления подзапроса.

Предикат "x операция-сравнения ALL S" имеет значение true, если S пусто или значение предиката "x операция-сравнения  s" равно true для каждого s, входящего в S. Предикат "x операция-сравнения  ALL S" имеет значение false, если значение предиката "x операция-сравнения  s" равно false хотя бы для одного s, входящего в S. В остальных случаях значение предиката "x операция-сравнения  ALL S" равно unknown.

Предикат "x операция-сравнения ANY S" имеет значение true, если S пусто или значение предиката "x операция-сравнения  s" равно true для какого-либо s, входящего в S. Предикат "x операция-сравнения  ANY S" имеет значение false, если значение предиката "x операция-сравнения  s" равно false хотя бы для одного s, входящего в S. В остальных случаях значение предиката "x операция-сравнения  ANY S" равно unknown.

Предикат "x операция-сравнения  SOME S" имеет значение false, если S пусто или значение предиката "x операция-сравнения  s" равно false для каждого s, входящего в S. Предикат "x операция-сравнения  SOME S" имеет значение true, если значение предиката "x операция-сравнения  s" равно true хотя бы для одного s, входящего в S. В остальных случаях значение предиката "x операция-сравнения  SOME S" равно unknown.

Предикат EXISTS имеет следующий синтаксис:

EXISTS подзапрос

Значением этого предиката всегда является true или false, и это значение равно true тогда и только тогда, когда результат вычисления подзапроса не пуст.

В Microsoft Jet SQL версии 4.0 определены предикаты сравнения, логические предикаты, а также предикат LIKE.

3.1.1.3. Разделы GROUP BY и HAVING

Опция GROUP BY позволяет сгруппировать выводимые записи. Если в табличном выражении присутствует раздел GROUP BY, то следующим после раздела WHERE или опции FROM выполняется этот раздел. Синтаксис раздела GROUP BY следующий:

GROUP BY список-полей-в-группах

Если обозначить через R таблицу, являющуюся результатом предыдущего раздела (FROM или WHERE), то результатом раздела GROUP BY является разбиение R на множество групп строк, состоящего из минимального числа групп таких, что для каждого столбца из списка столбцов раздела GROUP BY во всех строках каждой группы, включающей более одной строки, значения этого столбца равны. Для обозначения результата раздела GROUP BY в стандарте используется термин "сгруппированная таблица".

Раздел HAVING позволяет задать критерий для групп записей. Он имеет следующий синтаксис:

HAVING условие

Раздел HAVING может осмысленно появиться в табличном выражении только в том случае, когда в нем присутствует раздел GROUP BY. Условие поиска этого раздела задает условие на группу строк сгруппированной таблицы. Формально раздел HAVING может присутствовать и в табличном выражении, не содержащем GROUP BY. В этом случае полагается, что результат вычисления предыдущих разделов представляет собой сгруппированную таблицу, состоящую из одной группы без выделенных столбцов группирования.

Условие поиска раздела HAVING строится по тем же синтаксическим правилам, что и условие поиска раздела WHERE, и может включать те же самые предикаты. Однако имеются специальные синтаксические ограничения по части использования в условии поиска спецификаций столбцов таблиц из раздела FROM данного табличного выражения. Эти ограничения следуют из того, что условие поиска раздела HAVING задает условие на целую группу, а не на индивидуальные строки.

Поэтому в арифметических выражениях предикатов, входящих в условие выборки раздела HAVING, прямо можно использовать только спецификации столбцов, указанных в качестве столбцов группирования в разделе GROUP BY. Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций (см. ниже), вычисляющих в данном случае некоторое агрегатное значение для всей группы строк. Аналогично обстоит дело с подзапросами, входящими в предикаты условия выборки раздела HAVING: если в подзапросе используется характеристика текущей группы, то она может задаваться только путем ссылки на столбцы группирования.

Результатом выполнения раздела HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска есть true. В частности, если раздел HAVING присутствует в табличном выражении, не содержащем GROUP BY, то результатом его выполнения будет либо пустая таблица, либо результат выполнения предыдущих разделов табличного выражения, рассматриваемый как одна группа без столбцов группирования.

Пример.

GROUP BY users HAVING birthYear > 1970

3.1.1.4. Раздел ORDER BY

Опция ORDER BY позволяет упорядочить записи в порядке возрастания или убывания значений (для числовых записей) или в алфавитном порядке (для символьных записей). Синтаксис ORDER BY следующий:

[ORDER BY поле-упорядочения [ASC | DESC ]

Как видно из синтаксического правила, фактически задается список столбцов результата выражения запросов, и для каждого столбца указывается порядок просмотра строк результата в зависимости от значений этого столбца (ASC – по возрастанию (умолчание), DESC – по убыванию).

Пример.

ORDER BY birthYear

3.1.1.5. Примеры предложения SELECT

1. Получение значения полей имени пользователя userName и пароля  пользователя userPass из таблицы users можно получить с помощью следующего предложения:

SELECT userName, userPass FROM users;

2. Получение значений всех полей из таблицы Employees:

SELECT * FROM Employees;

3. Получение полей из двух таблицEmployees и  Supervisors:

SELECT Employees.Department, Supervisors.SupvName

FROM Employees INNER JOIN Supervisors

WHERE Employees.Department = Supervisors.Department;

В этом примере таблица Supervisors присоединяется к таблице Employees  по критерию равенства значений поля Department в обеих таблицах.

4. По умолчанию, в созданном в результате выполнения команды SELECT наборе данных, поля имеют те же имена, что и в исходной таблице. Следующее предложение изменяет имя поля в созданном наборе данных на Birth:

SELECT BirthDate AS

Birth FROM Employees;

5. Подключение таблицы заказов Orders к таблице покупателей Customers по идентификаторам компаний, и вывод списка компаний, которые имеют, по крайней мере, один заказ. Список упорядочен в соответствии с именами компаний (в алфавитном порядке):

SELECT DISTINCTROW CompanyName FROM Customers

INNER JOIN Orders

ON Customers.CustomerID = Orders.CustomerID

ORDER BY CompanyName;

6. Для каждой должности служащего Title по региону 'WA' в таблице служащих Employees подсчитать количество служащих в данной должности, присвоив результату псевдоним Tally и сгруппировать полученные записи по должностям:  

SELECT Title Count(Title) AS Tally FROM Employees

WHERE Region = 'WA' GROUP BY Title;

7. В предыдущем запросе вывести только те группы записей, для которых количество служащих в данной должности больше 1:

SELECT Title Count(Title) AS Tally FROM Employees

WHERE Region = 'WA'

GROUP BY Title HAVING Count(Title) > 1;

8. Получение о служащих, родившихся в семидесятые годы:

SELECT * FROM Employees

WHERE birthYear LIKE '197#';

9. Получение идентификаторов покупателя CustomerID, начинающихся на символ 'A' из таблицы покупателей Customers во внешней базе данных OtherDB.mdb:

SELECT CustomerID FROM Customers

IN OtherDB.mdb

WHERE CustomerID LIKE "A*"

3.1.2.  Создание новой таблицы из существующей таблицы

Создание новой таблицы из существующей таблицы выполняется с помощью следующего предложения:

SELECT поле1[, поле2[, ...]] INTO новая-таблица [IN внешняя-база-данных]

    FROM таблица

где поле1, поле2 – поля, копируемые в новую таблицу с именем новая-таблица, создаваемую из таблицы с именем таблица. Если задана опция IN, то таблица находится во внешней базе данных с именем внешняя-база-данных, иначе – в текущей базе данных.   

Пример.

Создание новой таблицы telephones, содержащей фамилии пользователей и их телефоны на основе таблицы users:

SELECT lastName, telephone INTO telephones

FROM users;

3.1.3. Вставка записей в таблицу

Вставка записей в таблицу выполняется с помощью следующих предложений:

1. Вставка нескольких записей:

INSERT INTO мишень [(поле1[, поле2[, ...]])] [IN внешняя-база-данных]

    SELECT [источник.]поле1[, поле2[, ...]

    FROM табличное-выражение

2. Вставка одной записи:

INSERT INTO мишень [(поле1[, поле2[, ...]])]

    VALUES (значение1[, значение2[, ...])

где мишень – имя таблицы или запроса, к которому добавляются записи, поле1, поле2 – имена полей, к которым добавляются записи (для мишени) или имена полей, из которых берутся данные (для источника), источник – имя таблицы, из которой берутся данные, табличное-выражение – имя таблицы, сохраняемое имя запроса или составной результат запроса из INNER JOIN, LEFT JOIN или RIGHT JOIN, значение1, значение2 – значения, вставляемые в указанные поля  новой записи.

В опции IN задается имя базы данных, из которой берется таблица (если таблица берется не из текущей базы данных).

Если какие-то значения в записи не определены, в запись заносятся значения по умолчанию или значение NULL.

Примеры.

1. Вставка в таблицу новой записи с заданными значениями полей FirstName, LastName и Title:

INSERT INTO Employees (FirstName, LastName, Title)

VALUES ('Harry', 'Washington', 'Trainee');

2. Вставка в таблицу Customers всех полей из таблицы NewCustomers:

INSERT INTO Customers

SELECT * FROM NewCustomers;

3.1.4. Изменение значений полей в таблице

Изменение значений полей в таблице выполняется с помощью следующего предложения:

UPDATE таблица SET новые-значения WHERE критерий-выбора

где таблица – имя таблицы, новые-значения – новые значения полей таблицы, задаваемые в виде списка имя-поля=значение-поля, а критерий-выбора определяется так же, как в опции WHERE предложения SELECT.

Пример.

Изменение значений полей OrderAmount и Freight в таблице Orders для пункта назначения – 'UK':

UPDATE Orders

SET OrderAmount = OrderAmount * 1.1,

Freight = Freight * 1.03 WHERE ShipCountry = 'UK';

3.1.5. Удаление записей из таблицы

Удаление записей из таблицы выполняется с помощью предложения

DELETE [таблица.*] FROM таблица 

WHERE критерий-выбора

где таблица – имя таблицы, из которой удаляются записи, а критерий-выбора определяется так же, как в опции WHERE предложения SELECT.

Пример.

Удаление всех записей, для которых значение должности равно 'Trainee', из таблицы Employees:

DELETE * FROM Employees

WHERE Title = 'Trainee'

3.2. Работа с базами данных в Java

3.2.1. Подключение к базе данных

Все интерфейсы, классы и исключения, связанные с доступом и обработкой данных в базах данных, содержатся в пакете java.sql. Пакет javax.sql расширяет возможности JDBC по взаимодействию клиента с сервером.

Доступ и обработка данных с помощью JDBC включает три шага:

  1.  Установка связи между Java-программой и диспетчером базы данных (подключение к базе данных).
  2.  Передача SQL-команды в базу данных с помощью объекта интерфейса  Statement пакета java.sql.
  3.  Чтение полученных результатов из базы данных и использование их в программе.

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

В стандартную поставку J2SE SDK входит мост JDBC-ODBC, реализованный классом JdbcOdbcDriver из пакета sun.jdbc.odbc. Другие драйверы JDBC поставляются вместе с СУБД или предлагаются независимыми фирмами.

Связь с источником данных можно установить посредством интерфейса ODBC. Для этого необходимо указать  имя источника данных – Data Source Name (DSN) с помощью следующих действий:

  •  в Панели управления  Windows войти в приложение Администрирование;
  •  в приложении Администрирование войти в приложение Источники данных (ODBC);
  •  во вкладке Системный DSN окна Администратор источников данных ODBC нажать кнопку Добавить;
  •  в поле Имя окна Создание нового источника данных выбрать драйвер (для Microsoft Access это будет драйвер  Microsoft Access Driver – (*.mdb)) и нажать кнопку Готово;
  •  в поле Имя источника данных окна Установка драйвера ODBC для Microsoft Access задать имя базы данных (например, officeDB);
  •  в поле Описание можно ввести описание базы данных (например, "База данных сотрудников института");
  •  в поле База данных нажать кнопку Выбрать и в окне Выбор базы данных в поле Диски выбрать диск, на котором находится база данных, а затем в поле Каталоги выбрать каталог, котором находится база данных;
  •  в поле Имя базы данных выделить имя выбранной базы данных и нажать кнопки OK для всех диалоговых окон приложения Источники данных (ODBC).

После этого база данных с заданным расположением (например, c:\DB\officeDB.mdb) становится доступной с выбранным именем (например, officeDB) для программы на языке Java, использующей  драйвер-мост JDBC-ODBC.

Загрузка драйвера-моста JDBC-ODBC в программе выполняется с помощью следующих операторов:

try

{

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

}

catch (ClassNotFoundException e)

{

System.err.println("Драйвер JDBC/ODBC не найден.");

}

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

jdbc:доп-протокол:доп-имя

Здесь доп-протокол это название набора драйверов, а доп-имя дополнительная информация, необходимая для этого набора, например

jdbc:odbc:myDatabase 

Сеанс с базой данных обеспечивается с помощью интерфейса Connection. Объект этого интерфейса создается с помощью метода getConnection() класса DriverManager (этот класс обеспечивает базовые услуги для управления набором драйверов JDBC). Две основные формы этого метода:  

public static Connection getConnection(String url)

throws SQLException

public static Connection getConnection(String url,

String user, String password) throws SQLException

устанавливают сеанс соединения с базой данных по указанному URL. Вторая форма используется для задания имени пользователя user и пароля доступа к базе данных password (эта форма необходима в тех случаях, когда доступ к базе данных требует аутентификации), например:

Connection myConnection = DriverManager.getConnection(

"jdbc:odbc:myDatabase", "Ivanov", "std");

Закрытие сеанса с базой данных выполняется с помощью метода

public void close() throws SQLException.

интерфейса Connection.

3.2.2. Передача SQL-команды в базу данных

Объект интерфейса Statement предназначен для хранения SQL-команд. При пересылке объекта Statement базе данных с помощью установленного подключения СУБД запустит заданную SQL-команду и возвратит результат ее выполнения в виде объекта ResultSet.

Объект интерфейса Statement создается с помощью метода

public Statement createStatement() throws SQLException

класса Connection.

Методы интерфейса Statement следует использовать внутри конструкции try {...} catch (SQLException) {...}, поскольку большинство этих методов могут инициировать исключительные ситуации SQLException.

Основными методами интерфейса Statement для выполнения запросов являются методы executeQuery() и  executeUpdate().  

Метод 

public ResultSet executeQuery(String sql)

throws SQLException, 

возвращающий результаты запроса в виде объекта интерфейса ResultSet, используется для выполнения запроса SQL для выборки данных (SELECT).

ResultSet queryResults =

stmt.executeQuery("SELECT * FROM myTable");

Те же действия можно выполнить иначе, используя методы

public boolean execute(String sql) throws SQLException

и

public ResultSet getResultSet() throws SQLException

Первый метод выполняет запрос SQL и возвращает true, если в результате выполнения запроса был создан объект класса ResultSet (обычно при выборке данных) и false – в противном случае (при модификации данных). Второй метод позволяет представить результаты запроса как объект интерфейса ResultSet. 

Метод getResultSet() можно использовать для извлечения сразу нескольких объектов ResultSet в ходе выполнения одного запроса. Если объект Statement содержит несколько объектов ResultSet, то для получения следующего объекта ResultSet нужно применить метод

public boolean getMoreResults() throws SQLException

Этот метод возвращает значение true, если следующим результатом является объект ResultSet, и false, если следующим результатом является целое число.

Если известно, что SQL-команда возвращает целое число, например, в виде количества обработанных строк, тогда можно использовать метод

public int executeUpdate(String sql) throws SQLException.

Метод executeUpdate() может использоваться не только вместе с SQL-командой UPDATE, но и вместе с командами INSERT и DELETE. Информацию о количестве извлеченных строк можно получить с помощью метода

public int getUpdateCount() throws SQLException.

Закрытие объекта Statement, выполняется с помощью метода  

public void close() throws SQLException.

3.2.3. Чтение результатов запроса

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

Объект ResultSet функционирует как курсор, в котором доступ к отдельной строке можно осуществить с помощью команды SELECT. Для перехода к следующей строке необходимо вызвать метод

public boolean next() throws SQLException,

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

Другие методы перемещения курсора:

public boolean previous() throws SQLException

public boolean first() throws SQLException

public boolean last() throws SQLException

public boolean beforeFirst() throws SQLException

public boolean afterLast() throws SQLException

public boolean relative(int rows) throws SQLException

соответственно устанавливают курсор на предыдущую строку, на первую строку, на последнюю строку, перед первой строкой набора, после последней строки набора или переместить на заданное число строк (вверх или вниз).   

Содержимое ячейки текущей строки можно получить с помощью одного из методов getXxx(), где Xxx – имя типа данных Java, например getString(), getInt(), getFloat(), getBoolean() и т.д. Метод возвращает значение соответствующего типа, например, String, int, float, boolean. Определен также метод getObject(), возвращающий содержимое ячейки как объект класса Object. Для каждого типа данных в интерфейсе ResultSet определены два метода. В качестве аргумента в первом методе  задается строка (тип String)  – имя столбца, а во втором – целое  число типа int – индекс столбца (индексация столбцов начинается с 0).

Для определения индекса столбца по его имени columnName можно использовать метод

public int findColumn(String columnName)

throws SQLException.

3.2.4. Получение сведений о базе данных

Методы для получения сведений о базе данных (метаданных базы данных) определены в интерфейсе DatabaseMetaData.

Объект интерфейса DatabaseMetaData создается с помощью метода

public DatabaseMetaData getMetaData() throws SQLException

интерфейса Connection.

Интерфейс DatabaseMetaData описывает почти двести информационных методов, позволяющих получить адрес, название и версию базы данных, типы данных, хранящихся в базе, набор допустимых операторов SQL, предельный объем таблиц, набор функций, имеющихся в базе, и т. п.

Большинство этих методов проверяют то или иное свойство базы и возвращают логические значения true или false. Например, метод

public boolean supportsGroupBy() throws SQLException

позволяет узнать, поддерживает ли язык запросов к данной базе оператор GROUP BY, а метод

public boolean isReadOnly() throws SQLException

позволяет проверить, позволяет ли данное соединение изменить данные, хранящиеся в базе.

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

public int getMaxRowSize() throws SQLException

возвращает максимально допустимую длину строки в таблицах базы, а метод

public int getMaxColumnNameLength() throws SQLException

выдает наибольшую длину имени столбца (ноль означает, что ограничения нет или оно неизвестно).

Рассмотрим те методы интерфейса DatabaseMetaData, которые позволяют получить наиболее общие сведения о базе данных.

Методы

public ResultSet getCatalogs() throws SQLException

public ResultSet getSchemas() throws SQLException

public ResultSet getTableTypes() throws SQLException

позволяют получить сведения о каталогах, схемах и типах для таблиц базы данных (типа String в первом столбце результирующего набора данных). Для таблиц определены следующие основные типы: "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM".

Получить характеристики таблиц базы данных можно с помощью метода:

public ResultSet getTables(String catalog,

String schemaPattern, String tableNamePattern,

String[] types) throws SQLException

где параметр catalog указывает каталог (если задан null, то имя каталога не учитывается при поиске), в котором находится база данных; параметр schemaPattern указывает шаблон для имени схемы (если задан null, то имя схемы не учитывается при поиске); параметр tableNamePattern указывают шаблон для имени таблицы, а параметр types задает массив типов таблиц, для которых производится получение характеристик (если задан null, то поиск производится для всех типов таблиц).

В шаблонах имен схемы и таблицы можно использовать символы "_" и "%". Первый символ означает любой одиночный символ, а второй – любую последовательность из нуля и более символов. Если эти символы встречаются в имени таблицы, то для того, чтобы они были представлены как обычные символы, для получения имени таблицы или части имени таблицы необходимо использовать метод

public String getSearchStringEscape() throws SQLException. 

В возвращаемом наборе типа ResultSet первый столбец содержит каталог таблицы, второй столбец – схему таблицы, третий столбец – имя таблицы, четвертый – тип таблицы и пятый – необязательный комментарий к таблице.

Получить характеристики столбцов в таблице можно с помощью метода

public ResultSet getColumns(String catalog,

String schemaPattern, String tableNamePattern,

String columnNamePattern) throws SQLException

где параметры catalog, schemaPattern и tableNamePattern имеют тот же смысл, что и в методе getTables(), а параметр задает шаблон для имени столбца.

В возвращаемом наборе типа ResultSet первый столбец содержит каталог таблицы, второй столбец – схему таблицы, третий столбец – имя таблицы, четвертый – имя столбца, пятый – SQL-тип столбца (тип short), шестой – тип имени и седьмой – размер столбца (тип int).   

3.2.5. Получение сведения о выборке из базы данных

Кроме выборки и курсора, объект типа ResultSet содержит еще общие сведения о выборке. Они описаны интерфейсом ResultSetMetaData. Объект типа ResultSetMetaData создается с помощью метода

public ResultSetMetaData getMetaData() throws SQLException,

описанного в интерфейсе ResultSet. В интерфейсе ResultSetMetaData определены следующие основные методы (все методы имеют модификатор public и бросают исключение SQLException):

  •  int getColumnCount() – возвращает число выбранных столбцов;
  •  String getColumnName(int column) – возвращает имя столбца с номером column;
  •  String getColumnLabel(int column) – возвращает предполагаемое имя столбца с номером column;
  •  String getColumnClassName(int column) – возвращает имя класса Java, которому принадлежат данные столбца column выборки (для примитивного типа возвращается имя соответствующего класса-оболочки);
  •   int getColumnType(int column) – возвращает для столбца column выборки числовую константу класса Types, в пакете java.sql (в этом классе определены статические константы типа int для типов данных SQL);
  •  String getColumnTypeName(int column) – возвращает для столбца column выборки имя типа данных SQL;
  •   int getColumnDisplaySize(int column) – возвращает наибольшую ширину столбца column в символах;
  •  int getPrecision(int column) – возвращает наибольшее количество цифр для столбца column, (если данное в этом столбце является числовым);
  •  int getScale(int n) – возвращает количество цифр после запятой для столбца column, (если данное в этом столбце является числовым);
  •  String getSchemaName(int column)возвращает имя схемы для столбца column;
  •  String getTableName(int column)возвращает имя таблицы для столбца column;
  •  String getCatalogName(int column)возвращает имя каталога для столбца column.

Логические методы интерфейса ResultSetMetaData:

public boolean isReadOnly(int column) throws SQLException

public boolean isWritable(int column) throws SQLException

public int isNullable(int column) throws SQLException

public boolean isCaseSensitive(int column)

throws SQLException

public boolean isSearchable(int column) throws SQLException

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

Если в базе данных поддерживаются хранимые процедуры (это еще один способ исключения повторных компиляций SQL-команд), то для повышения эффективности работы приложения можно воспользоваться интерфейсом CallableStatement. Для этого нужно использовать метод

CallableStatement prepareCall(String sql)

интерфейса Connection с символами "?" в качестве заменителей параметров. Затем нужно применить методы getТип() с целочисленными аргументами для извлечения значения нужного параметра по порядковому номеру, например,

boolean getBoolean(int parameterIndex),

возвращающий параметр BIT в JDBC как булевское значение.

3.3. Работа с таблицами в Java

3.3.1. Класс JTable

Таблицы в Java создаются с помощью графического компонента JTable в пакете javax.swing. Простые таблицы можно создать с помощью одного из следующих конструкторов:

  •  public JTable();
  •  public JTable(int numRows, int numColumns);
  •  public JTable(Object[][] rowData, Object[] columnNames);
  •  public JTable(Vector rowData, Vector columnNames).

Первый конструктор создает пустую таблицу, второй – пустую таблицу с  numRows строк и numColumns столбцов, третий и четвертый – таблицу с заданными значениями ячеек rowData и заданными именами столбцов columnNames.

Эти таблицы имеют фиксированный размер и неизменяемое содержание. Однако часто таблицы формируются динамически, например, в результате запроса SELECT к базе данных. В этом случае при создании таблиц используется схема MVC (Model-View-Controller – Модель, Вид, Управление). Интерфейсом TableModel задается модель ячеек таблицы, а интерфейсом TableColumnModel – модель столбцов таблицы. Кроме этого, для  выделения ячеек таблицы используется модель выделения списков ListSelectionModel.

Использование моделей при создании таблицы задается с помощью следующих конструкторов:

  •  public JTable(TableModel dm);
  •  public JTable(TableModel dm, TableColumnModel cm);
  •  public JTable(TableModel dm, TableColumnModel cm,

ListSelectionModel sm).     

3.3.2. Модель ячеек таблицы

Использование модели ячеек таблицы позволяет задавать динамически изменяющиеся таблицы, а также представлять данные в таблицах объектами разных классов. Модель таблицы задается интерфейсом TableModel, а также реализующими его классами AbstractTableModel и DefaultTableModel. Интерфейс и классы содержатся в пакете javax.swing.table.

3.3.2.1. Интерфейс TableModel

Чтобы задать свою модель таблицы, надо создать класс, реализующий методы интерфейса TableModel:

  •  Class<?> getColumnClass(int columnIndex) – получение класса для объекта в ячейках столбца с индексом  columnIndex (если в ячейках  заданы объекты разных классов, возвращаемое значение содержит суперкласс объектов);
  •  int getColumnCount() – получение количества столбцов в модели;
  •  int getRowCount() – получение количества строк в модели;
  •  String getColumnName(int columnIndex) – получение наименования столбца с индексом columnIndex в модели;
  •  Object getValueAt(int rowIndexint columnIndex) – получения значения в ячейке с индексом строки rowIndex и индексом столбца columnIndex;
  •  void setValueAt(Object aValueint rowIndexint columnIndex) – установка значения aValue в ячейке с индексом строки rowIndex и индексом столбца columnIndex;
  •  boolean isCellEditable(int rowIndexint columnIndex) – проверка возможности редактирования ячейки с индексом строки rowIndex и индексом столбца columnIndex (возвращает true, если ячейку можно редактировать и false – в противном случае).

Строки и столбцы таблицы нумеруются, начиная с индекса 0.

Кроме этого, должны быть реализованы методы

void addTableModelListener(TableModelListener l)

и

void removeTableModelListener(TableModelListener l).

Первый метод добавляет блок прослушивания для изменения в модели таблицы, второй – удаляет блок прослушивания.

Интерфейс TableModelListener содержит единственный метод

void tableChanged(TableModelEvent e).

Класс TableModelEvent содержит следующие конструкторы:

  •  public TableModelEvent(TableModel source) – событие изменения для всех строк таблицы с моделью source;
  •  public TableModelEvent(TableModel source, int row)событие изменения для строки row таблицы с моделью source;
  •  public TableModelEvent(TableModel source, int firstRow, int lastRow) – событие изменения для строк в диапазоне от firstRow до  lastRow таблицы с моделью source;
  •  public TableModelEvent(TableModel source, int firstRow, int lastRow, int column) – событие изменения в столбце column для строк в диапазоне от firstRow до  lastRow таблицы с моделью source;
  •  public TableModelEvent(TableModel source, int firstRow, int lastRow, int column, int type) – событие изменения типа type в столбце column для строк в диапазоне от firstRow до  lastRow таблицы с моделью source.

Тип события в последнем конструкторе описывается с помощью одного из следующих полей класса TableModelEvent:

  •  public static final int INSERT – добавление новых строк или столбцов в таблицу;
  •  public static final int UPDATE – изменение данных в таблице;
  •  public static final int DELETE – удаление  строк или столбцов из таблицы.

В классе определены также поля

public static final int ALL_COLUMNS

и

public static final int HEADER_ROW

для определения всех столбцов в строке или строках и для определения строки заголовка.

Методы класса TableModelEvent:

public int getColumn();

public int getFirstRow();

public int getLastRow();

public int getType()

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

3.3.2.2. Класс AbstractTableModel

Абстрактный класс AbstractTableModel управляет блоками прослушивания изменения модели таблицы, а также реализует большинство методов интерфейса TableModel. Поэтому в классе модели таблицы, расширяющим класс AbstractTableModel, достаточно обеспечить реализацию только следующих трех методов: public int getRowCount(), public int getColumnCount() и public Object getValueAt(int row, int column).

Дополнительно в классе AbstractTableModel определены следующие методы:

  •  public int findColumn(String columnName) – найти индекс столбца по его имени columnName (если столбец не найден, возвращается -1);
  •  public void fireTableCellUpdated(int rowint column) – уведомляет все блоки прослушивания, что ячейка с индексом строки row и индексом столбца column изменена;
  •  public void fireTableChanged(TableModelEvent e) – уведомляет все блоки прослушивания, что произошло событие e;
  •  public void fireTableDataChanged() – уведомляет все блоки прослушивания, что данные в таблице возможно были изменены;
  •  public void fireTableRowsDeleted(int firstRowint lastRow)– уведомляет все блоки прослушивания, что строки в таблице в диапазоне от firstRow до lastRow включительно были удалены;
  •  public void fireTableRowsInserted(int firstRow, int lastRow) – уведомляет все блоки прослушивания, что строки в таблице в диапазоне от firstRow до lastRow включительно были вставлены;
  •  public void fireTableRowsUpdated(int firstRow,  int lastRow) – уведомляет все блоки прослушивания, что строки в таблице в диапазоне от firstRow до lastRow включительно были изменены;
  •  public void fireTableStructureChanged() – уведомляет все блоки прослушивания, что структура таблицы была изменена;
  •  public <T extends EventListener> T[] getListeners(Class<T> listenerType) – возвращает массив всех объектов типа listenerType, которые были зарегистрированы как блоки прослушивания для данного объекта AbstractTableModel;
  •  public TableModelListener[] getTableModelListeners() – возвращает массив всех объектов типа TableModelListener, зарегистрированных как блоки прослушивания для данного объекта AbstractTableModel.

3.3.2.3. Класс DefaultTableModel

Класс DefaultTableModel, который расширяет класс AbstractTableModel, создает редактируемую модель ячеек таблицы.

Для этого класса определены следующие конструкторы:

  •  public DefaultTableModel() – создание модели с нулевыми значения для количества строк и столбцов;
  •  public DefaultTableModel(int rowCount, int columnCount)создание модели с rowCount строк и columnCount столбцов;
  •  public DefaultTableModel(Object[][] data, Object[] columnNames) и public  DefaultTableModel(Vector data, Vector columnNames)создание модели с данными data и именами столбцов columnNames и инициализация таблицы;
  •  public DefaultTableModel(Object[] columnNames, int rowCount) и public  DefaultTableModel(Vector columnNames, int rowCount)создание модели с именами столбцов columnNames и количеством строк rowCount (данные в ячейках задаются как null).

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

  •  public void addColumn(Object columnName);
  •  public void addColumn(Object columnName,

Object[] columnData);

  •  public void addColumn(Object columnName,

Vector columnData).

В этих методах параметр columnName – это наименование столбца, а параметр columnData – массив или вектор данных во всех строках столбца.

Для столбцов определены также методы, позволяющие установить их характеристики:

public void setColumnCount(int columnCount)установка количества столбцов columnCount;

public void setColumnIdentifiers(Object[] newIdentifiers) и public void setColumnIdentifiers(Vector newIdentifiers)установка наименований столбцов newIdentifiers,

а также методы для получения характеристик столбцов:

public int getColumnCount() – получение текущего количества столбцов;

public String getColumnName(int column) – получение текущего наименования столбца с индексом column.

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

public void addRow(Object[] rowData)

или

public void addRow(Vector rowData),

а вставка строки rowData в строку с индексом row выполняется с помощью одного из методов:

public void insertRow(int row, Object[] rowData)

или

public void insertRow(int row, Vector rowData).

Метод

public void newRowsAdded(TableModelEvent e)

обеспечивает правильное заполнение новой строки. Если для заполнения новой строки указан вектор с количеством элементов, большим, чем число столбцов, то лишние элементы обрезаются. Если же размер вектора меньше количества столбцов, то в оставшихся столбцах строки задается значение null. Метод также уведомляет блоки прослушивания, что произошло событие e.

Метод

public void moveRow(int start, int end, int to)

перемещает строки, начиная с индекса start до индекса end включительно в строку с индексом to, а метод

public void removeRow(int row)

удаляет строку с индексом row из модели.

Метод

public void setRowCount(int rowCount)

устанавливает количество строк rowCount в модели, а метод

public int getRowCount()

позволяет получить текущее количество строк в модели.

Метод

public void setDataVector(Vector dataVector,

Vector columnIdentifiers)

позволяет полностью заменить содержимое данных модели вектором dataVector (каждый элемент этого вектора в свою очередь является вектором), а также содержимое наименований столбцов модели columnIdentifiers, а метод

public Vector getDataVector()

позволяет получить вектор данных модели.

Методы 

public void newDataAvailable(TableModelEvent event)

и

public void rowsRemoved(TableModelEvent event)

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

Обычно при создании своей модели данных создается класс, расширяющий класс DefaultTableModel.

3.3.2.4. Установка и получение модели данных

Для установки модели таблицы используется метод

public void setModel(TableModel dataModel)

класса JTable, а для получения текущей модели используется метод

public TableModel getModel().

Другие методы класса JTable позволяют получить соответствие между выводимой таблицей и моделью таблицы. Так, метод

public int convertColumnIndexToModel(int viewColumnIndex)

преобразует индекс выводимого столбца viewColumnIndex в индекс того же столбца в модели таблицы, а метод

public int convertColumnIndexToView(int modelColumnIndex)

выполняет обратное преобразование. 

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

public int convertRowIndexToModel(int viewRowIndex)

и

public int convertRowIndexToView(int modelRowIndex).

3.3.3. Работа с ячейками таблицы

3.3.3.1. Редактирование ячеек таблицы

Редактирование ячеек таблицы выполняется с использованием интерфейса TableCellEditor в пакете javax.swing.table и реализующего его класса DefaultCellEditor в пакете javax.swing.

Интерфейс TableCellEditor является расширением интерфейса CellEditor, содержащего определения следующих методов:

  •  void cancelCellEditing()запрещение редактирования ячейки;
  •  Object getCellEditorValue() – возвращает значение в редактируемой ячейке;
  •  boolean isCellEditable(EventObject anEvent) – запрашивает редактор, можно ли начинать редактирование при наступлении события anEvent;
  •  boolean shouldSelectCell(EventObject anEvent) – запрашивает редактор, должна ли редактироваться ячейка при наступлении события anEvent;
  •  boolean stopCellEditing() – указывает редактору на прекращение редактирования ячейки и принятия для редактора частично отредактированного значения.

Методы

void addCellEditorListener(CellEditorListener l)

и

void removeCellEditorListener(CellEditorListener l)

добавляют и удаляют блок прослушивания для редактора ячейки.

Интерфейс CellEditorListener содержит определения методов

void editingStopped(ChangeEvent e)

и 

void editingCanceled(ChangeEvent e),

указывающим блоку прослушивания на прекращение или отмену редактирования.

Класс ChangeEvent содержит метод 

public Object getSource(),

возвращающий объект, который вызвал событие.

Интерфейс TableCellEditor добавляет к методам интерфейса CellEditor объявление единственного метода

Component getTableCellEditorComponent(JTable table,

Object value, boolean isSelected, int row, int column),

возвращающего компонент для редактирования. Параметр table задает таблицу для редактирования, параметр value – значение редактируемой ячейки, параметр isSelected – возможность подсветки ячейки (true, если ячейка подсвечивается, false – в противном случае), а параметры row и column задают индексы строки и столбца ячейки.

Этот метод реализован в классе DefaultCellEditor, который содержит следующие конструкторы

public DefaultCellEditor(JTextField textField)

public DefaultCellEditor(JCheckBox checkBox)

public DefaultCellEditor(JComboBox comboBox),

создающие объект DefaultCellEditor как текстовое поле textField, переключатель checkBox или раскрывающееся меню comboBox.

Помимо методов интерфейса CellEditor в классе реализованы следующие методы:

  •  public void setClickCountToStart(int count) – устанавливает количество щелчков мыши count для начала редактирования ячейки;
  •  public int getClickCountToStart()– получает количество щелчков мыши для начала редактирования ячейки;
  •  public Component getComponent() – возвращает ссылку на редактируемый компонент.

3.3.3.2. Рисование ячеек таблицы

Интерфейс TableCellRenderer в пакете javax.swing.table определяет единственный метод, который возвращает компонент, используемый для рисования ячейки таблицы

Component getTableCellRendererComponent(JTable table,

Object value, boolean isSelected, boolean hasFocus,

int row, int column).

Параметр table задает таблицу для редактирования, параметр value – значение рисуемой ячейки, параметр isSelected – возможность подсветки ячейки (true, если ячейка подсвечивается, false – в противном случае), параметр hasFocus, если значение равно true, задает соответствующий вывод ячейки (например, при редактировании вывод другой границы), а параметры row и column задают индексы строки и столбца ячейки.

Класс DefaultTableCellRenderer помимо определения рассмотренного выше метода переопределяет также следующие методы:

  •  public void validate(), public void invalidate() и public void revalidate()  класса Container;
  •  public void repaint() класса Component;
  •  public boolean isOpaque(), public void repaint(long tm, int x, int y, int width, int height), public void repaint(Rectangle r), public void setBackground(Color c) и public void setForeground(Color c) класса JComponent.

3.3.4. Работа со столбцами таблицы

Класс TableColumn содержит методы установки и получения характеристик столбцов таблицы. Интерфейс TableColumnModel и реализующий его класс DefaultTableColumnModel описывают модель хранения столбцов таблицы. Интерфейс и классы содержатся в пакете javax.swing.table.

3.3.4.1. Класс TableColumn

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

  •  public TableColumn(int modelIndex, int width,

TableCellRenderer cellRenderer,

TableCellEditor cellEditor);

  •  public TableColumn(int modelIndex, int width);
  •  TableColumn(int modelIndex);
  •  TableColumn().

Параметр modelIndex задает индекс столбца в модели, который задает данные для этого столбца в таблице, параметр width задает предпочитаемую и начальную ширину столбца, а параметры cellRenderer и cellEditor задают объекты, используемые для рисования и редактирования данных в столбцах. По умолчанию значение индекса столбца равно 0, ширина столбца равна 75, а параметры рисования и редактирования равны null.

Методы 

public void setModelIndex(int modelIndex)

и

public int getModelIndex()

позволяют установить и получить индекс модели для столбца.

Методы

public void setMaxWidth(int maxWidth);

public void setMinWidth(int minWidth);

public void setPreferredWidth(int preferredWidth)

устанавливают максимальную, минимальную и предпочтительную ширину столбца, а методы

public int getMaxWidth();

public int getMinWidth();

public int getPreferredWidth() 

позволяют получить указанные значения.

Методы

public void setCellEditor(TableCellEditor cellEditor);

public void setCellRenderer(TableCellRenderer cellRenderer);

public void setHeaderRenderer(TableCellRenderer

headerRenderer)

устанавливают объекты для редактирования и рисования ячеек (третий метод задает объект для рисования только заголовка), а методы

public TableCellEditor getCellEditor();

public TableCellRenderer getCellRenderer();

public TableCellRenderer getHeaderRenderer()

позволяют получить указанные значения.

public void setIdentifier(Object identifier)

устанавливает идентификатор для столбца, а метод

public Object getIdentifier()

позволяет получить значение идентификатора.

Методы

public void setHeaderValue(Object headerValue)

и

public Object getHeaderValue()

устанавливают и получают заголовок столбца.

Метод

public void setResizable(boolean isResizable)

устанавливает возможность изменения размеров столбца (если задано true), а метод

public boolean getResizable()

проверяет возможность изменения столбца.

Метод

public void sizeWidthToFit()

подгоняет ширину столбца под ширину заголовка.

Для установки и отмены блока прослушивания изменения значения столбца используются методы

public void addPropertyChangeListener(

PropertyChangeListener listener)

и

public void removePropertyChangeListener(

PropertyChangeListener listener).

Интерфейс PropertyChangeListener содержит один метод

void propertyChange(PropertyChangeEvent evt).

В классе PropertyChangeEvent определены следующие методы:

  •  public Object getOldValue() – получение старого значения свойства;
  •  public Object getNewValue() – получение нового значения свойства;
  •  public String getPropertyName() – получение имени измененного свойства.

3.3.4.2. Интерфейс TableColumnModel

В интерфейсе TableColumnModel определены следующие операции над столбцами:

  •  void addColumn(TableColumn aColumn) – добавление столбца aColumn в конец массива столбца;
  •  void moveColumn(int columnIndex, int newIndex) – перемещение столбца с индексом columnIndex в новую позицию newIndex;
  •  void removeColumn(TableColumn column)удаление столбца column.

Методы

void setColumnMargin(int newMargin)

и

int getColumnMargin()

позволяют установить или получить величину границы (в пикселях) для столбца.

Метод

void setColumnSelectionAllowed(boolean flag)

задает разрешение (если значение flag равно true) или отмену (если значение flag равно false) выделения столбцов, а метод

boolean getColumnSelectionAllowed()

позволяет получить текущее значение переключателя flag.

Метод

void setSelectionModel(ListSelectionModel newModel)

устанавливает модель выбора для столбца, а метод

ListSelectionModel getSelectionModel()

позволяет получить текущую модель выбора.

Следующие методы позволяют получить различные характеристики модели столбцов:

  •  TableColumn getColumn(int columnIndex) – получение объекта TableColumn для столбца с индексом columnIndex;
  •  int getColumnCount() – получение количества столбцов в модели;
  •  int getColumnIndex(Object columnIdentifier) – получение индекса первого столбца в таблице, для которого идентификатор равен columnIdentifier;
  •  int getColumnIndexAtX(int xPosition) – получение индекса столбца в точке с координатой x, равной xPosition;
  •  Enumeration<TableColumn> getColumns() – получение коллекции типа Enumeration для всех столбцов модели;
  •  int getSelectedColumnCount() – получение количества выделенных столбцов;
  •  int[] getSelectedColumns() – получение массива индексов всех выделенных столбцов;
  •  int getTotalColumnWidth() – получение общей ширины всех столбцов.

Метод

void addColumnModelListener(TableColumnModelListener x)

добавляет блок прослушивания x для модели столбцов, а метод

void removeColumnModelListener(TableColumnModelListener x)

удаляет блок прослушивания x.

В интерфейсе TableColumnModelListener определены следующие методы:

  •  void columnAdded(TableColumnModelEvent e) – оповещение блока прослушивания о добавлении столбца в модель;
  •  void columnMoved(TableColumnModelEvent e) – оповещение блока прослушивания о перемещении столбца в модели;
  •  void columnMarginChanged(ChangeEvent e) – оповещение блока прослушивания о перемещении столбца в модели из-за изменения границы;
  •  void columnRemoved(TableColumnModelEvent e) – оповещение блока прослушивания об удалении столбца в модели;
  •  void columnSelectionChanged(ListSelectionEvent e) – оповещение блока прослушивания об изменении модели выбора столбца.

В классе TableColumnModelEvent определен конструктор

public TableColumnModelEvent(TableColumnModel source,

int from, int to),

где параметр source задает модель  таблице, параметр from задает индекс, с которого перемещается или удаляется столбец, а параметр to – индекс, в который перемещается или добавляется столбец.

В классе определены также два метода:

public int getFromIndex()

и

public int getToIndex(),

возвращающие значения параметров from и to.

Класс ChangeEvent рассмотрен в разд. 3.3.3.1, а класс ListSelectionEvent рассмотрен далее в разд. 3.3.6.1.

3.3.4.3. Класс DefaultTableColumnModel

Класс DefaultTableColumnModel реализует методы интерфейса DefaultTableColumnModel, а также содержит следующие методы:

  •  public TableColumnModelListener[] getColumnModelListeners() – получение массива всех блоков прослушивания модели столбцов;
  •  public <T extends EventListener> T[] getListeners(Class<T> listenerType) – получение массива всех блоков прослушивания событий для модели столбцов;
  •  public void propertyChange(PropertyChangeEvent evt) – отслеживает изменения ширины столбцов (класс PropertyChangeEvent рассмотрен в 3.3.4.1);
  •  public void valueChanged(ListSelectionEvent e)обработка изменения выделения столбцов.

Методы

protected void fireColumnAdded(TableColumnModelEvent e);

protected void fireColumnMarginChanged();

protected void fireColumnMoved(TableColumnModelEvent e);

protected void fireColumnRemoved(TableColumnModelEvent e);

protected void

fireColumnSelectionChanged(ListSelectionEvent e)

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

Метод

protected void recalcWidthCache()

пересчитывает общую ширину всех столбцов.

3.3.4.4. Установка и получение модели столбцов

Модель столбцов для таблицы устанавливается с помощью метода

public void setColumnModel(TableColumnModel columnModel)

класса JTable, а получение текущей модели столбцов выполняется с помощью метода

public TableColumnModel getColumnModel().

3.3.5. Работа с заголовком таблицы

Операции с заголовком таблицы выполняются с помощью методов класса JTableHeader в пакете javax.swing.table.

Для класса определены два конструктора:

public JTableHeader()

и

public JTableHeader(TableColumnModel cm).

Второй конструктор задает для заголовка модель столбцов таблицы cm (если в качестве параметра задан null, выбирается модель столбца по умолчанию).

Методы класса

protected TableColumnModel createDefaultColumnModel()

и

protected TableCellRenderer createDefaultRenderer()

возвращают модель столбцов таблицы и класс рисования ячеек таблицы, используемые по умолчанию.

Методы

public void setColumnModel(TableColumnModel columnModel)

и

public void setDefaultRenderer(

TableCellRenderer defaultRenderer)

устанавливают модель столбца и класса рисования ячеек для заголовка, а методы

public TableColumnModel getColumnModel()

и

public TableCellRenderer getDefaultRenderer()

позволяют получить заданную модель и класс рисования ячеек.

Методы

public void setDraggedDistance(int distance)

и

public int getDraggedDistance()

позволяют установить и получить расстояние, на которое перетаскивается столбец.

Метод

public void setReorderingAllowed(boolean reorderingAllowed)

позволяет установить (если значение reorderingAllowed равно true) или отмену (если значение reorderingAllowed равно false) возможность перестановки столбцов, а метод

public boolean getReorderingAllowed()

позволяет получить текущее значение параметра reorderingAllowed.

Аналогичным образом методы

public void setResizingAllowed(boolean resizingAllowed)

и

public boolean getResizingAllowed()

устанавливают и получают возможность изменения ширины столбцов.

Методы

public TableColumn getDraggedColumn()

и

public TableColumn getResizingColumn()

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

Метод

public void setTable(JTable table)

устанавливает таблицу, связанную с заголовком, а метод

public JTable getTable()

возвращает таблицу, связанную с заголовком.

3.3.6. Выделение ячеек таблицы

Выделение ячеек таблицы выполняется с помощью реализации методов интерфейса ListSelectionModel или с помощью методов класса DefaultListSelectionModel, реализующего интерфейс ListSelectionModel. Интерфейс и класс находятся в пакете в пакете javax.swing.

3.3.6.1. Интерфейс ListSelectionModel

Для интерфейса ListSelectionModel определены следующие поля, определяющие режимы выбора из списка:

  •  static final int MULTIPLE_INTERVAL_SELECTIONмножественный выбор из списка;
  •  static final int SINGLE_INTERVAL_SELECTIONвыбор одного диапазона элементов из списка;
  •  static final int SINGLE_SELECTION – выбор только одного элемента из списка.

Установка режима выборки для списка выполняется с помощью метода

void setSelectionMode(int selectionMode)

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

int getSelectionMode().

В интерфейсе ListSelectionModel определены следующие основные методы для операций над индексами:

  •  public void setSelectionInterval(int index0, int index1) – установка выделенного интервала от index0 до index1 включительно;
  •  public void addSelectionInterval(int index0, int index1) – добавление к выделенному интервалу элементов от index0 до index1 включительно;
  •  public void removeSelectionInterval(int index0, int index1) – исключение из выделенного интервала элементов от index0 до index1 включительно;
  •  public void clearSelection()очистка сделанного выбора;
  •  public boolean isSelectionEmpty() – проверка, не является ли выборка пустой;
  •  public Object clone() throws CloneNotSupportedExceptionвозврат копии сделанного выделения;
  •  public void setAnchorSelectionIndex(int anchorIndex)установка начального индекса для выделения;
  •  public int getAnchorSelectionIndex() – получение начального индекса выделения;
  •  public void setLeadSelectionIndex(int leadIndex) – установка конечного индекса для выделения;
  •  public int getLeadSelectionIndex() – получение конечного индекса выделения;
  •  public int getMinSelectionIndex() – получение первого выделенного индекса (если выделения не было, возвращается -1);
  •  public int getMaxSelectionIndex() – получение последнего выделенного индекса (если выделения не было, возвращается -1);
  •  public void insertIndexInterval(int index, int length, boolean before) – вставка интервала длиной до (если значение before равно true) или после (если значение before равно false) индекса index;
  •  public boolean isSelectedIndex(int index)проверка выделения индекса index.

Метод

void addListSelectionListener(ListSelectionListener x)

добавляет блок прослушивания выделения элементов в списке x, а метод

void removeListSelectionListener(ListSelectionListener x)

удаляет блок прослушивания x.

Интерфейс ListSelectionListener определяет единственный метод

void valueChanged(ListSelectionEvent e),

а методы класса ListSelectionEvent

public int getFirstIndex()

и

public int getLastIndex()

позволяют получить начальный и конечный индекс выделения.

3.3.6.2. Класс DefaultListSelectionModel

Класс DefaultListSelectionModel реализует все методы интерфейса ListSelectionModel.

3.3.6.3. Получение и установка модели выделения в таблице

Модель выделения элементов таблицы устанавливается с помощью метода

public void setSelectionModel(ListSelectionModel newModel)

класса JTable, а получение текущей модели выделения выполняется с помощью метода

public ListSelectionModel getSelectionModel().

3.3.7. Работа с компонентом JTable в NetBeans IDE 6.1

Для компонента JTable в NetBeans IDE 6.1 определены следующие основные свойства:

  •  autoCreateRawSorter – включение переключателя для этого свойства задает возможность сортировки строк при щелчке мышью по заголовку этого столбца (при первом щелчке – по возрастанию значений в столбце, при втором – по убыванию);
  •  background, foreground и font – задания цвета фона, цвета переднего плана и шрифта для ячеек данных таблицы;
  •  model – задание модели для таблицы (имя модели задается в текстовой области диалогового окна свойства при включенной радиокнопке User Code;
  •  autoResizeMode – задание режима автоматического выравнивания ширины столбцов в таблице;
  •  cellEditor – задание редактора ячеек для таблицы (имя редактора задается в текстовой области диалогового окна свойства при включенной радиокнопке User Code;
  •  cellSelectionEnabled – включение/выключение выделения ячеек, а не столбцов или строк;
  •  columnModel – задание модели столбцов таблицы (имя модели задается в текстовой области диалогового окна свойства при включенной радиокнопке User Code;
  •  columnSelectionAllowed – включение/выключение выделения столбцов;
  •  dragEnabled – включение/выключение возможности перетаскивания столбцов;
  •  editingColumn – задание режима редактирования столбца;
  •  editingRow – задание режима редактирования строки;
  •  enabled – включение/выключение активизации таблицы;
  •  gridColor – задание цвета границ ячеек для данных таблицы;
  •  rowMargin – задание расстояния между ячейками таблицы (в пикселях);
  •  rowSelectionAllowed – включение/выключение выделения строк;
  •  rowSorter – задание сортировщика для строк таблицы (можно использовать сортировщик по умолчанию TableRowSorter или задать свой сортировщик в текстовой области диалогового окна свойства при включенной радиокнопке User Code;
  •  selectionBackground и selectionForeground – задание цвета фона и цвета переднего плана для выделенного элемента таблицы;
  •  selectionModel – задание модели выделения для таблицы (можно использовать модель по умолчанию DefaultListSelectionModel или задать свою модель в текстовой области диалогового окна свойства при включенной радиокнопке User Code;
  •  showHorizontalLines – включение/выключение вывода горизонтальных линий в таблице;
  •  showVerticalLines – включение/выключение вывода вертикальных линий в таблице;
  •  tableHeader – задание заголовка для таблицы (можно задать свой заголовок в текстовой области диалогового окна свойства при включенной радиокнопке User Code);
  •  updateSelectionOnSort – включение/выключение изменения выделения при сортировке в таблице.

  

4. Порядок выполнения работы

Напишите программу на языке Java по одному из приведенных ниже вариантов с использованием базы данных office.mdb.

База данных office.mdb содержит три таблицы: таблицу сведений о сотрудниках – staff, таблицу ставок зарплаты сотрудников по должностям  – salaries и таблицу наименований отделов – departments.

Таблица staff имеет следующую структуру:

Идентификатор (целое число) –  табельный номер сотрудника (это поле является первичным ключом).

  1.  ФИО (текстовое поле длиной 50 символов) – фамилия и инициалы сотрудника.
  2.  Пол (логическое поле) – пол сотрудника (мужской – true или женский – false).
  3.  Должность (текстовое поле длиной 50 символов) – должность сотрудника.
  4.  Код отдела (текстовое поле длиной 50 символов) – код отдела, в котором работает сотрудник.  
  5.  Дата рождения (длинный формат даты) – дата рождения сотрудника (число месяц и год).
  6.  Дата приема (длинный формат даты) – дата приема сотрудника на работу в учреждение (число месяц и год).

Вторая таблица salaries имеет следующую структуру:

Должность (текстовое поле длиной 50 символов) – должность сотрудника (это поле является первичным ключом);

Зарплата (число с плавающей точкой с двумя цифрами после запятой) – должностной оклад сотрудника.

Третья таблица departments имеет следующую структуру:

  1.  Код отдела (текстовое поле длиной 50 символов) – код (сокращенное наименование) отдела учреждения (это поле является первичным ключом);
  2.  Наименование отдела (целое число) – (текстовое поле длиной 50 символов) – полное наименование отдела учреждения.

Связь с базой данных  устанавливается с помощью  интерфейса ODBC (см. 3.1). Программа должна быть разработана как приложение Swing.

Вариант 7-01

Создайте программу, выводящую содержимое таблицы staff базы данных officeDB.mdb по заданному критерию – должность сотрудника. Вывод выполняется (все столбцы таблицы) в виде таблицы (JTable) в области Center. (список должностей формируется на основании значений столбца "Должность" в таблице salary). Выбор должности   производится с помощью списка (JList) "Должность" в области East (из списка можно выбрать несколько должностей).  Вывод таблицы выполняется при нажатии кнопки (JButton) "Вывод таблицы" в области South. Выборка из базы данных и формирование данных  таблицы выполняется в методе getTablePostChoiceTable().

Вариант 7-02

Создайте программу, выводящую содержимое таблицы staff базы данных officeDB.mdb по заданному критерию – пол сотрудника. Вывод выполняется (без столбца "Пол") в виде таблицы (JTable) в области Center. Выбор пола (мужской, женский или все сотрудники)  производится с помощью раскрывающегося меню (JComboBox) "Пол" в области East.  Вывод таблицы выполняется при нажатии кнопки (JButton) "Вывод таблицы" в области South. Выборка из базы данных и формирование данных  таблицы выполняется в методе getTableGenderChoiceTable().

Вариант 7-03

Создайте программу, выводящую столбцы "ФИО", "Пол" и "Должность"  таблицы staff базы данных officeDB.mdb, отсортированное по заданному столбцу в заданном направлении сортировки (возрастающем или убывающем).  Выбор столбца, для которого производится сортировка и направление сортировки задаются в двух раскрывающихся меню (JComboBox) "Столбец" для задания имени столбца и "Направление" с двумя значениями ("По возрастанию" и ("По убыванию") в области East. Сортировка столбца выполняется при выполнении запроса SELECT к базе данных. Вывод таблицы выполняется при нажатии кнопки (JButton) "Вывод таблицы" в области South. Выборка из базы данных и формирование данных  таблицы выполняется в отдельном методе getColumnSortTable().

Вариант 7-04

Создайте программу, выводящую столбцы "ФИО", "Отдел", "Дата рождения" и "Дата приема" таблицы staff базы данных officeDB.mdb, отсортированное по заданному столбцу в заданном направлении сортировки (возрастающем или убывающем).  Наименования столбцов таблицы задаются в виде радиокнопок (JRadioButton), а направление сортировки также задается в виде двух радиокнопок "По возрастанию" и "По убыванию" в области East. Сортировка столбца выполняется при выполнении запроса SELECT к базе данных. Вывод таблицы выполняется при нажатии кнопки (JButton) "Вывод таблицы" в области South. Выборка из базы данных и формирование данных  таблицы выполняется в отдельном методе getColumnSortTable().

Вариант 7-05

Создайте программу, выводящую столбцы "ФИО", "Должность" и "Возраст"  таблицы staff базы данных officeDB.mdb. Вывод выполняется  в виде таблицы (JTable) в области Center. В столбце "Возраст" задается (по данным столбца "Дата рождения")  возраст сотрудника (в годах). Дата рождения сотрудника выводится в области East в текстовом поле  (JTextField) "Дата рождения" при выделении строки для данного сотрудника в таблице (щелчке по строке мышью). Выборка из базы данных, преобразование значений и формирование данных  таблицы выполняется в отдельном методе getConvertTable().

Вариант 7-06

Создайте программу, выводящую столбцы "ФИО", "Отдел" и "Стаж"  таблицы staff базы данных officeDB.mdb. Вывод выполняется  в виде таблицы (JTable) в области Center. В столбце "Стаж" задается (по данным столбца "Дата рождения")  стаж работы сотрудника в учреждении (в годах). Дата приема выводится в области East в текстовом поле  (JTextField) "Дата приема" при выделении строки для данного сотрудника в таблице (щелчке по строке мышью). Выборка из базы данных, преобразование значений и формирование данных  таблицы выполняется в отдельном методе getConvertTable().

Вариант 7-07

Создайте программу, выводящую столбцы "ФИО", "Пол",  "Должность" и  "Дата рождения" таблицы staff базы данных officeDB.mdb по заданным критериям – минимальный и максимальный возраст сотрудников. Вывод выполняется  в виде таблицы (JTable) в области Center.  В области East размещается кнопка (JButton) "Вывод таблицы", при нажатии на которую выполняется вывод выборки из таблицы, "Минимальный возраст", числовой вращающийся список (в диапазоне от 17 до 70) для ввода минимального возраста, переключатель (JCheckBox) "Максимальный возраст", числовой вращающийся список (в диапазоне от 17 до 70), для ввода максимального возраста. Если включены оба переключателя,  выводятся данные по всем сотрудникам, возраст которых меньше максимального возраста и больше минимального возраста. Если включен только первый переключатель, выводятся данные по всем сотрудникам, возраст которых больше минимального возраста. Если включен только второй переключатель, выводятся данные по всем сотрудникам, возраст которых меньше максимального возраста. Если оба переключателя выключены, выводятся данные о всех сотрудниках. Выборка из базы данных и формирование данных  таблицы выполняется в отдельном методе getAgeChoiceTable().

Вариант 7-08

Создайте программу, выводящую столбцы "ФИО",   "Отдел" и  "Дата приема" таблицы staff базы данных officeDB.mdb по заданным критериям – минимальный и максимальный стаж сотрудников. Вывод выполняется  в виде таблицы (JTable) в области Center.  В области East размещается кнопка (JButton) "Вывод таблицы", при нажатии на которую выполняется вывод выборки из таблицы, надпись (JLabel) "Минимальный возраст", текстовое поле (JTextField) для ввода минимального стажа, надпись (JLabel) "Максимальный возраст", текстовое поле (JTextField) для ввода максимального стажа. Если в текстовых полях заданы оба значения,  выводятся данные по всем сотрудникам, стаж которых меньше максимального возраста и больше минимального стажа. Если задано только первое текстовое поле, выводятся данные по всем сотрудникам, стаж которых больше минимального стажа. Если задано только второе текстовое поле, выводятся данные по всем сотрудникам, возраст которых меньше максимального стажа. Если оба текстовые поля пустые, выводятся данные о всех сотрудниках. Для вводимых в текстовых полях данных производится проверка на соответствие шаблону (две цифры). Выборка из базы данных и формирование данных  таблицы выполняется в отдельном методе getExpChoiceTable().

Вариант 7-09

Создайте программу, выводящую ведомость зарплаты сотрудников заданного отдела с использованием содержимого таблиц staff, departments и salary базы данных officeDB.mdb. Вывод ведомости (столбцов "ФИО", "Должность" и "Зарплата") выполняется  в виде таблицы (JTable) в области Center. В области East размещается кнопка (JButton) "Вывод ведомости", при нажатии на которую выполняется вывод выборки из таблиц, и раскрывающееся меню (JComboBox) "Отдел" с наименованиями отделов (наименования отделов определяются из столбца "Наименование отдела" в таблице departments). Выборка из базы данных и формирование данных  таблицы выполняется в отдельном методе getSalaryTable().

Вариант 7-10

Создайте программу, выводящую список сотрудников заданного отдела с использованием содержимого таблиц staff, и departments базы данных officeDB.mdb. Вывод списка (столбцов "Идентификатор",  "ФИО", "Пол" и "Должность") выполняется  в виде таблицы (JTable) в области Center. В области East размещается кнопка (JButton) "Вывод таблицы", при нажатии на которую выполняется вывод выборки из таблиц, и раскрывающееся меню (JComboBox) "Отдел" с наименованиями отделов (наименования отделов определяются из столбца "Наименование отдела" в таблице departments). Выборка из базы данных и формирование данных  таблицы выполняется в отдельном методе getDepTable().

Вариант 7-11

Создайте программу, добавляющую новую запись в таблицу salary базы данных officeDB.mdb. Вывод выполняется  в виде таблицы (JTable) в области Center. В области East размещается кнопка (JButton) "Вывод таблицы", при нажатии на которую выполняется вывод таблицы, и два текстовых поля  (JTextField) "Должность" и "Зарплата" для ввода новой должности и соответствующей ей зарплаты, а также кнопка (JButton) "Добавить" для добавления новой записи в таблицу и новой строки в выводимую в области Center таблицу. При вводе данных должна производиться их проверка на соответствие шаблону: для должности – маленькие буквы кириллицы и точки, для зарплаты – 3 или 4 цифры, запятая и две цифры после запятой. Добавление в базу данных выполняется в отдельном методе addDataInSalaryTable().

Вариант 7-12

Создайте программу, изменяющую запись в таблице salary базы данных officeDB.mdb. Вывод выполняется  в виде таблицы (JTable) в области Center. В области East размещается кнопка (JButton) "Вывод таблицы", при нажатии на которую выполняется вывод таблицы, надпись (JLabel) "Должность", раскрывающееся меню (JComboBox) для выбора должности,  надпись (JLabel) "Зарплата" и текстовое поле (JTextField) для нового значения зарплаты для выбранной должности, а также кнопка (JButton) "Изменить" для изменеия новой записи в таблице и соответствующей строки в выводимой в области Center таблицу. При вводе новой зарплаты должна производиться ее проверка на соответствие шаблону: 3 или 4 цифры, запятая и две цифры после запятой. Изменения в базе данных выполняется в отдельном методе modDataInSalaryTable().

Вариант 7-13

Создайте программу, удаляющую запись из таблицы staff базы данных officeDB.mdb. В области East в текстовом поле (JTextField) "ФИО"  вводится строка – один или несколько символов фамилии. После нажатия кнопки (JButton) "Выбрать" в текстовом поле (JTextArea) "Сотрудники" выводится построчно идентификатор и ФИО сотрудника, фамилия которого начинается на заданную строку. В текстовом поле (JTextField) "Идентификатор" вводится идентификатор  сотрудника, запись о котором удаляется из таблицы. При нажатии кнопки (JButton) "Удалить" в области South сотрудник с заданным идентификатором удаляется из таблицы и обновленная таблица (JTable) выводится в области Center. Удаление строки из базы данных выполняется в отдельном методе deleteRecordByIdentInStaffTable().

Вариант 7-14

Создайте программу, удаляющую запись из таблицы staff базы данных officeDB.mdb. В области East задается кнопка (JButton) "Просмотр", при нажатии на которую  в области Center выводятся  таблица (JTable) со столбцами "Идентификатор", "ФИО" и "Отдел" таблицы staff. В текстовом поле (JTextField) "ФИО" вводится ФИО  сотрудника, запись о котором удаляется из таблицы. При нажатии кнопки (JButton) "Удалить" в области South сотрудник с заданным ФИО удаляется из таблицы и обновленная таблица (JTable) выводится в области Center. Удаление строки из базы данных выполняется в отдельном методе deleteRecordByNameInStaffTable().

Вариант 7-15

Создайте программу, добавляющую новую запись в таблицу departments базы данных officeDB.mdb. Вывод выполняется  в виде таблицы (JTable) в области Center. В области East размещается кнопка (JButton) "Вывод таблицы" для вывода таблицы и кнопка  (JButton) "Добавить", при нажатии на которую открывается диалоговое окно с двумя текстовыми полями  (JTextField) "Код отдела" и "Наименование отдела" для ввода нового кода и наименования отдела, а также кнопкой "OK". При вводе данных должна производиться их проверка на соответствие шаблону: для кода отдела – большие буквы кириллицы, для наименования отдела – начинается с большой буквы, содержит буквы кириллицы, пробелы и запятые. После нажатия кнопки "OK" и передачи полей новой записи вызывающему окну новая запись добавляется в таблицу базы данных и выводимую в области Center таблицу. Добавление в базу данных выполняется в отдельном методе addDataInDepartmentTable().

Вариант 7-16

Создайте программу, изменяющую запись в таблице departments базы данных officeDB.mdb. Вывод выполняется  в виде таблицы (JTable) в области Center. В области East размещается кнопка (JButton) "Вывод таблицы" для вывода таблицы и кнопка  (JButton) "Изменить", при нажатии на которую открывается диалоговое окно с раскрывающемся меню (JComboBox), содержащим список кодов отделов и текстовым полем  (JTextField) "Наименование отдела" для ввода нового наименования отдела для выбранного в меню кода, а также кнопкой "OK". При вводе наименования отдела должна производиться проверка на соответствие шаблону: начинается с большой буквы, содержит буквы кириллицы, пробелы и запятые. После нажатия кнопки "OK" и передачи нового наименования отдела вызывающему окну наименование отдела изменяется в таблице базы данных и выводимой в области Center таблице. Изменение базы данных выполняется в отдельном методе modDataInDepartmentTable().

Вариант 7-17

Создайте программу, в которой формируется  запрос SELECT к таблице salary базы данных officeDB.mdb. Вывод  выполняется  в виде таблицы (JTable) в области Center. Запрос формируется в области East с помощью списка (JList) с надписью (JLabel)  "Столбец" имен столбцов таблицы (в котором можно выбрать один или оба столбца для вывода), текстового поля (JTextField) с надписью (JLabel) "WHERE:", в котором задается в формате SQL критерий выбора, раскрывающееся меню (JComboBox) имен столбцов с надписью (JLabel) "ORDER BY:" и двух радиокнопок (JRadioButton)   "ASC" и "DESC". Сформированный запрос выводится в текстовом поле (JTextField) "SQL:" в области South  и выполняется при нажатии кнопки (JButton) "Выполнить" (также в области South). Выборка из базы данных и формирование данных  таблицы выполняется в отдельном методе getChoiceInStaffTable().

Вариант 7-18

Создайте программу, в которой формируется  запрос SELECT к таблице departments базы данных officeDB.mdb. Вывод  выполняется  в виде таблицы (JTable) в области Center. Запрос формируется в области East с помощью списка двух переключателей (JCheckBox) с именами  столбцов таблицы (в котором можно выбрать один или оба столбца для вывода), текстового поля (JTextField) с надписью (JLabel) "WHERE:", в котором задается в формате SQL критерий выбора, надписью (JLabel) "ORDER BY:", двух радиокнопок (JRadioButton) с именами столбцов и раскрывающееся меню (JComboBox) с пунктами   "ASC" и "DESC". Сформированный запрос выводится в текстовом поле (JTextField) "SQL:" в области South  и выполняется при нажатии кнопки (JButton) "Выполнить" (также в области South). Выборка из базы данных и формирование данных  таблицы выполняется в отдельном методе getChoiceInStaffTable().

Вариант 7-19

Создайте программу, определяющую статистические данные для сотрудников отделов из таблиц staff и salary базы данных officeDB.mdb. Данные размещаются в области Center в виде таблицы (JTable) со столбцами "Наименование отдела", "Количество сотрудников" (общее количество сотрудников), "Мужчин" (количество мужчин в отделе), "Женщин" (количество женщин в отделе) и "Фонд зарплаты" (сумма зарплат сотрудников отдела) и выводятся при нажатии кнопки (JButton) "Вывод таблицы". Получение данных из базы и формирование данных  таблицы выполняется в отдельном методе getSalaryStatDataTable().

Вариант 7-20

Создайте программу, определяющую статистические данные для сотрудников отделов из таблицы staff базы данных officeDB.mdb. Данные размещаются в области Center в виде таблицы (JTable) со столбцами "Наименование отдела", "Зав.лабы" (количество заведующих лабораториями в отделе), "Научн.сотр" (количество ведущих старших, младших и просто научных сотрудников в отделе), "Инженеры" (количество ведущих старших, младших и просто инженеров в отделе), "Лаборанты" (количество старших и просто лаборантов в отделе). Данные выводятся при нажатии кнопки (JButton) "Вывод таблицы". Получение данных из базы и формирование данных  таблицы выполняется в отдельном методе getPostDataTable().

Вариант 7-21

Создайте программу, выводящую ведомость на ежеквартальную премию для сотрудников заданного отдела из таблиц staff и salary базы данных officeDB.mdb. Премия рассчитывается по формуле:

коэффициент-1 * квартальная зарплата + коэффициент-2 * стаж

В области East в раскрывающемся меню (JComboBox) вводится наименование  отдела, а в текстовых полях (JTextField) "Коэффициент 1" и "Коэффициент 2" – значения соответствующих коэффициентов (меньше 1 с одной или двумя цифрами после запятой). В области Center размещается выборка из таблицы (JTable), содержащая поля "Идентификатор", "ФИО", "Должность"  и "Премия".  Вывод таблицы выполняется при нажатии кнопки "Вывод ведомости" в области South. Получение данных из базы и формирование данных  таблицы выполняется в отдельном методе getBonusTable().

Вариант 7-22

Создайте программу, выводящую ведомость на зарплату для сотрудников заданного отдела из таблиц staff и salary базы данных officeDB.mdb. Налог на зарплату рассчитывается по формуле:

(коэффициент-1 * зарплата) *коэффициент-2 

В области East в раскрывающемся меню (JComboBox) вводится наименование  отдела, а в текстовых полях (JTextField) "Коэффициент 1" и "Коэффициент 2" – значения соответствующих коэффициентов в процентах (однозначное или двузначное число). В области Center размещается выборка из таблицы (JTable), содержащая поля "Идентификатор", "ФИО", "Должность",  "Зарплата" (выдаваемая на руки, без налогов).  Вывод таблицы выполняется при нажатии кнопки "Вывод ведомости" в области South. Получение данных из базы и формирование данных  таблицы выполняется в отдельном методе getMonthSalaryTable().

Вариант 7-23

Создайте программу, выполняющую статистическую обработку данных в таблицах staff и salary базы данных officeDB.mdb. В области East в раскрывающемся меню (JComboBox) "Параметр" со значениями "Возраст", "Стаж" и "Зарплата" вводится поле для обработки. Полученные значения выводятся в области Center как таблица (JTable) со столбцами "Наименование отдела", "Максимум", "Минимум" и "Среднее".  Вывод таблицы выполняется при нажатии кнопки "Вывод статистики" в области South. Получение данных из базы и формирование данных  таблицы выполняется в отдельном методе getMeanStatisticsTable().

Вариант 7-24

Создайте программу, выполняющую статистическую обработку данных в таблице в таблицах staff и salary базы данных officeDB.mdb. В области East в раскрывающемся меню (JComboBox) "Параметр" со значениями "Возраст", "Стаж" и "Зарплата" вводится поле для обработки, а в текстовом поле  (JTextField) с надписью (JLabel) "Значение" вводится критерий обработки в виде либо ">значение", либо "<значение", либо "=значение",  где значение – значение соответствующего поля (для возраста двузначное число, для стажа однозначное или двузначное число, для зарплаты трех или четырехзначное число с точкой и одной или двумя цифрами после точки). Полученные значения выводятся в области Center как таблица (JTable) со столбцами "Наименование отдела", "Количество" (количество сотрудников, удовлетворяющих заданному критерию).  Вывод таблицы выполняется при нажатии кнопки "Вывод статистики" в области South. Получение данных из базы и формирование данных  таблицы выполняется в отдельном методе getNumberStatisticsTable().

Вариант 7-25

Создайте программу, изменяющую код отдела в таблицах departments и  staff базы данных officeDB.mdb. При нажатии кнопки (JButton) "Просмотр departments" в области Center выводится таблица (JTable) departments. В области East в раскрывающемся меню с надписью (JLabel) "Код отдела" выбирается код отдела и в текстовом поле (JTextField) с надписью (JLabel) "Новый код" вводится новое значение кода отдела (при этом выполняется проверка значение на соответствие шаблону – одна или несколько больших букв кириллицы). При нажатии  кнопки (JButton) "Изменить" в области East новый код отдела заменяет старый и в соответствующем поле таблицы departments и в полях записей таблицы staff. Измененное содержимое таблицы staff выводится как таблица (JTable) в области Center при нажатии кнопки  (JButton) "Просмотр staff" в области East. Получение данных из базы и  их изменение выполняется в отдельном методе modDepIdInTables().

Вариант 7-26

Создайте программу, изменяющую наименование должности в таблицах salary и  staff базы данных officeDB.mdb. При нажатии кнопки (JButton) "Просмотр salary" в области East в области Center выводится таблица (JTable) salary. В области East в раскрывающемся меню с надписью (JLabel) "Должность" выбирается наименование должности и в текстовом поле (JTextField) с надписью (JLabel) "Новое имя" вводится новое наименование должности (при этом выполняется проверка значение на соответствие шаблону – одна или несколько маленьких букв кириллицы и одно или несколько точек). При нажатии  кнопки (JButton) "Изменить" в области East новое наименование должности заменяет старое и в соответствующем поле таблицы salary и в полях записей таблицы staff. Измененное содержимое таблицы staff выводится как таблица (JTable) в области Center при нажатии кнопки  (JButton) "Просмотр staff" в области East. Получение данных из базы и  их изменение выполняется в отдельном методе modPostIdInTables().

Вариант 7-27

Создайте программу, выполняющую поиск сотрудников по заданному критерию в таблице staff базы данных officeDB.mdb. Вывод (столбцы "ФИО", "Должность", "Дата рождения" и "Дата приема") выполняется  в виде таблицы (JTable) в области Center. В области East размещается кнопка (JButton) "Вывод таблицы", при нажатии на которую выполняется вывод таблицы, раскрывающееся меню (JComboBox) с надписью (JLabel) "Параметр" со значениями "Возраст", "Стаж" и  два текстовых поля  (JTextField) "Больше" и "Меньше" для ввода критерия поиска. Если заполнены оба поля, ищутся все записи, удовлетворяющие заданному диапазону, если заполнено одно поле – соответственно больше или меньше указанного значения (значения в полях должны содержать две цифры, причем значение в поле "Меньше" должно быть меньше или равно значению в поле "Больше"). Выборка из базы данных и формирование данных  таблицы выполняется в отдельном методе getCriteriaChoiceTable().

Вариант 7-28

Создайте программу, выполняющую поиск сотрудников по заданному критерию в таблице staff базы данных officeDB.mdb. Вывод (столбцы "Идентификатор", "ФИО", "Должность") выполняется  в виде таблицы (JTable) в области Center. В области East список (JList) с надписью (JLabel) "Идентификаторы", в котором выводятся идентификаторы сотрудников.  В области East размещается также кнопка (JButton) "Вывод таблицы", при нажатии на которую выполняется вывод записей таблицы для сотрудников, идентификаторы которых выбраны в цикле.  Выборка из базы данных и формирование данных  таблицы выполняется в отдельном методе getChoiceByIdTable().

Вариант 7-29

Создайте программу, выводящую описание таблицы базы данных officeDB.mdb. В области East в раскрывающемся меню (JComboBox) с надписью (JLabel) "Таблица" вводится  имя таблицы (staff, departments или salary), а в области Center в виде таблицы (JTable) выводятся следующие характеристики столбцов таблицы: порядковый номер столбца, наименование столбца, класс Java для данных столбца,  максимальная ширина поля (для символьных данных), максимальный размер числа и количество цифр после запятой (для числовых данных).  Получение данных из базы и  формирование данных в таблице выполняется в отдельном методе getMetadataInTables().

Вариант 7-30

Создайте программу, выводящую описание параметров запроса на выборку из базы данных таблицы базы данных officeDB.mdb. В области North в текстовой области (JTextArea) с надписью (JLabel) "Запрос SQL" вводится запрос SELECT к вводится В области East в раскрывающемся меню (JComboBox) с надписью (JLabel) "Таблица" вводится  имя таблицы (staff, departments или salary), а также   текстовая область (JTextArea) с надписью (JLabel) "Столбцы", в которой вводится список столбцов таблицы или символ "*". В области Center в виде таблицы (JTable) выводятся следующие характеристики выводимых в запросе столбцов таблицы: порядковый номер столбца, наименование столбца, класс Java для данных столбца,  максимальная ширина поля (для символьных данных), максимальный размер числа и количество цифр после запятой (для числовых данных).  Получение данных из базы и  формирование данных в таблице выполняется в отдельном методе getQueryMetadataInTables().

5. Содержание отчета

В отчете должен быть представлен текст программы (без сгенерированного кода), а также один или несколько скриншотов, отражающих выполнение программы.       

6. Вопросы для самоконтроля

  1.  Какие основные предложения для операций над базами данных определены в SQL?
  2.  Как получить заданные столбцы таблицы базы данных с использованием SQL?
  3.  Как объединить записи двух таблиц для выборки с использованием SQL?
  4.  Как определить критерий выбора, ограничивающий количество выводимых записей с использованием SQL?
  5.  Какие предикаты условий поиска определены в SQL? Дайте краткое описание каждого предиката.
  6.  Как можно сгруппировать выводимые по запросу записи с использованием SQL?
  7.  Как можно упорядочить по возрастанию или убыванию выводимые в запросе  записи с использованием SQL?
  8.  Как можно создать новую таблицу из существующей таблицы с использованием SQL?
  9.  Как можно вставить записи в таблицу с использованием SQL?
  10.  Как можно изменить запись в таблице с использованием SQL?
  11.  Как можно удалить запись в таблице с использованием SQL?
  12.  Как выполняется доступ и обработка данных с помощью JDBC?
  13.  Как в программе на языке Java выполняется подключение к базе данных с помощью JDBC?
  14.  Как выполняется запрос SQL на выборку в  базе данных в программе на языке Java?
  15.  Как выполняется запрос SQL на вставку, изменение или удаление данных  в программе на языке Java?
  16.  Как организован доступ к результатам запроса к базе данных в программе на языке Java?
  17.  Как можно получить данные в ячейках таблицы в программах на языке Java?
  18.  Какие сведения о базе данных можно получить с помощью методов интерфейса DatabaseMetaData?
  19.  Какие сведения о текущей выборке из базы данных можно получить с помощью методов интерфейса ResultSetMetaData?
  20.  Как создаются простые таблицы в Java?
  21.  Какие модели можно использовать при формировании таблицы? Дайте краткое описание каждой модели.
  22.  Какие методы определены в интерфейсе TableModel?
  23.  Как выполняется обработка событий в модели таблицы?
  24.  Какие дополнительные методы операций с моделью таблицы определены в классе AbstractTableModel?
  25.  Какие конструкторы определены для класса DefaultTableModel?
  26.  Какие методы для работы со столбцами определены в классе DefaultTableModel?
  27.  Какие методы для работы со строками определены в классе DefaultTableModel?
  28.  Как можно установить и получить модель данных таблицы?
  29.  Какие методы редактирования ячеек определены в интерфейсах CellEditor и TableCellEditor?
  30.  Какие дополнительные методы редактирования ячеек определены в классе DefaultCellEditor?
  31.  Как выполняется рисование ячеек таблицы с использованием интерфейса TableCellRenderer и класса DefaultTableCellRenderer?
  32.  Какие конструкторы определены для класса TableColumn?
  33.  Какие методы для работы со столбцами определены в классе TableColumn?
  34.  Как выполняется обработка событий для столбцов таблицы?
  35.  Какие операции над столбцами определены в интерфейсе TableColumnModel?
  36.  Какие методы интерфейса TableColumnModel позволяют получить различные характеристики модели столбцов?
  37.  Как выполняется обработка событий для модели столбцов таблицы?
  38.  Какие дополнительные методы для работы со столбцами таблицы определены в классе DefaultTableColumnModel?
  39.  Как можно установить и получить модель столбцов таблицы?
  40.  Какие конструкторы и методы определены для работы с заголовком таблицы в классе JTableHeader?
  41.  Какие режимы выбора из списка определены для интерфейса ListSelectionModel?
  42.  Какие основные методы для операций над индексами определены в интерфейсе ListSelectionModel?
  43.  Как выполняется обработка событий выделения элементов таблицы?
  44.  Как можно установить и получить модель выделения в таблице?
  45.  Какие основные свойства определены для компонента JTable в NetBeans IDE 5.5.1 BlueJ Edition?

Файл: file:///web/1/5fan/public_html/www/files/14/5fan_ru_71707_cc1780bebfd2c79475df706926824e46.doc   Создан: 2013-12-02T11:50:00Z Модифицирован: 2013-12-02T11:50:00Z     Автор:


 

А также другие работы, которые могут Вас заинтересовать

2484. Оценка финансовых результатов и маржинальный анализ 237.5 KB
  Оценка финансовых результатов на основе метода маржинального анализа. Анализ обеспеченности трудовыми ресурсами и их использование. Анализ угрозы банкротства (отечественный опыт). Анализ дебиторской и кредиторской задолженности. Анализ рентабельности продаж и производства продукции.
2485. Изучение динамики вращательного движения на крестообразном маятнике (маятник Обербека) 169.89 KB
  Определение момента инерции грузов, находящихся на стержнях маятника Обербека. Определение момента инерции маятника Обербека с учетом сил трения в подшипниках маятника, определение отношения моментов сил, действующих на маятник при его движения для случаев, когда нить намотана на шкивы разных радиусов.
2486. Определение скорости пули при помощи баллистического маятника 235.68 KB
  Цель работы. Определить скорость пули и потери механической энергии при неупругом взаимодействии пули и ловушки, используя закон сохранения момента импульса, закон сохранения и превращения энергии.
2487. Изучение физического маятника. Лабораторная работа 74.77 KB
  Выполнив лабораторную работу, научились определять ускорение свободного падения методом Бесселя.
2488. Изучение свободных и вынужденных колебаний пружинного маятника 77.26 KB
  Цель работы: ознакомление с основными законами колебательного движения, определение коэффициента жесткости пружины, проверка формулы периода колебаний пружинного маятника, определение логарифмического декремента затухания и коэффициента затухания, изучение явления резонанса при вынужденных колебаниях.
2489. Общий физический практикум. Задача 125.79 KB
  Цель работы: Изучение законов динамики вращательного движения. Экспериментальное определение момента инерции диска с помощью маятника Максвелла.
2490. Изучение физического маятника 99.16 KB
  Цель работы: Исследование законов колебательного движения физического маятника и определение ускорения свободного падения.
2491. Изучение физических свойств маятника 57.82 KB
  Математический маятник. Физический маятник. Его характеристика. В данной работе используется универсальный маятник FPM-04, изображённый на рис.2. Основание 1 оснащено регулируемыми ножками 2, которые позволяют произвести выравнивание установки.
2492. Изучение маятника Максвелла 55.4 KB
  Движение твёрдого тела можно рассматривать как движение системы большого числа материальных точек, сохраняющих неизменное положение друг относительно друга. Одним из примеров такой системы является маятник Максвелла.