Скачать .docx  

Реферат: Работа с базами данных

Факультет «Информатика и системы управления»

Методические указания к лабораторной работе

по курсу «Распределенные системы обработки информации»

"Работа с базами данных"

Москва 2004 г.

Оглавление

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

1. Задание для домашней подготовки. 5

2. Задание к лабораторной работе. 6

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

4. Контрольные вопросы.8

5. Литература.9

6. Приложение 1. Описание JDBC.. 10

6.1 Класс Connection. 11

6.1.1Открытие соединения. 11

6.1.2JDBC URL. 12

6.2 Класс Statement13

6.2.1Выполнение запроса. 13

6.2.2Закрытие объектов Statement15

6.2.3Подстановочный (ecape) синтаксис SQL в объектах Statement15

6.3 Класс CallableStatement15

6.4 ResultSet16

6.4.1Обзор. 16

6.4.2Строки и курсоры.. 16

6.4.3Колонки. 17

6.4.4Типы данных и их преобразование. 17

7. Приложение 4. mySQL. 19

7.1 Установка ODBC‑драйвера для работы с mySql19

8. Приложение 3. Источник данных. 20

8.1 DSN.. 20

8.2 Настройка MyODBC DSN.. 20

9. Приложение 4. Пример программы.. 23

10. Приложение 5. Компонент JTable. 28

10.1 TableModel28

10.2 Класс JTable. 30

Цель работы

1. Познакомитьсяс JDBC (Java DataBase Connectivity) 2.0 API.

2. ОсвоитьклассыConnection, DatabaseMetaData, Statement, ResultSet пакетаjava.sql.

3. Осовоить класс JTable из пакета javax.swing.

4. Применить полученные знания на практике

1. Задание для домашней подготовки

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

2. Задание к лабораторной работе

Разработать оконное приложение, в котором будет отображаться информация из базы данных. Помимо отображения информации из БД, оно должно позволять добавлять или/и удалять записи. Данные представить в виде таблиц (использовать компонент JTable).

Сложность БД – неограниченная. Минимум – она должна содержать хотя бы одну таблицу.

СУБД выбирается студентом самостоятельно.

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

Отчет должен содержать:

1. Постановку задачи, решаемой отлаженной программой.

2. Руководство пользователя отлаженной программы, содержащее описание интерфейсов всех функций программы.

3. Листинг программы с необходимыми комментариями.

4. Контрольные вопросы

1. Что такое JDBC?

2. Как осуществляется соединение?

3. Что передается в стороке URL?

4. Что делает класс Statement?

5. Какие есть типы запросов и классы для их выполнения?

6. Для чего нужен класс ResultSet?

7. Как извлекаются данные из ResultSet?

8. Как связаны табличная модель (TableModel) и класс JTable?

5. Литература

1. Кен Арнольд, Джеймс Гослинг, Дэвид Холмс. Язык программирования Java™.

2. Официальный сайт Java– http://java.sun.com/ (есть раздел на русском языке с учебником).

3. Java™ 2 SDK, Standard Edition Documentation – http://java.sun.com/products/jdk/1.5/index.html.

4. Джеймс Гослинг, Билл Джой, Гай Стил. СпецификацияязыкаJava (TheJavaLanguageSpecification– http://www.javasoft.com/docs/books/jls/). Перевод на русский язык – http://www.uni-vologda.ac.ru/java/jls/index.html

5. Официальный сайт проекта Eclipse– http://www.eclipse.org/.

6. www.citforum.ru


6. Приложение 1. Описание JDBC

JDBC – это пакет, обеспечивающий API для единообразного доступа к различным источникам данных на основе языка баз данных SQL.

Подразумевается, что одна и та же Java‑программа сумеет с помощью JDBC реально работать в среде Windows с данными MySQL или же в среде Solaris с данными Informix. Она же может быть хранимой процедурой в БД под Oracle и работать с данными той же Oracle или, к примеру, Sybase.

Реализуется JDBC в виде интерфейсов java.sql (основной) и javax.sql (расширенный). Конкретный набор классов, реализующий JDBC‑интерфейс и осуществляющий доступ к конкретной СУБД, называется драйвером.

JDBC позволяет:

· Установить соединение с источником данных

· Посылать ему SQL‑запросы

· Обрабатывать результаты.

В следующем фрагмента кода это продемонстрировано.

// УстанавливаемсоединениеConnection con = DriverManager.getConnection («jdbc:odbc:wombat», «login», «password»);Statement stmt = con.createStatement(); // ВыполняемзапросResultSet rs = stmt.executeQuery («SELECT a, b, c FROM Table1»);while (rs.next()){int x = getInt («a»); // получаемрезультатString s = getString («b»);float f = getFloat («c»);

}


6.1 Класс Connection

Объект Connection представляет собой соединение с БД. Сессия соединения включает в себя выполняемые SQL‑запросы и возвращаемые через соединение результаты. Приложение может открыть одно или более соединений с одной или несколькими БД.

6.1.1 Открытие соединения

Стандартный способ получения соединения – это вызов метода DriverManager.getConnection. Этому методу передается строка, содержащая т.н. «URL». Класс DriverManager, представляющий собой уровень управления в JDBC, пытается найти драйвер, который может соединиться к БД с помощью данного URL. Класс DriverManager содержит список зарегистрированных классов Driver, и при вызове метода getConnection он проверяет каждый драйвер и ищет среди них тот, который может соединиться с БД, указанной в URL. Метод connect драйвера использует этот URL для установления соединения.

Пользователь может пропустить этот управляющий уровень JDBC и вызывать непосредственно методы класса Driver для открытия соединения. Это может быть нужным в тех редких случаях, когда два или более драйвера могут обслужить заданный URL, но пользователь хочет выбрать конкретный из них. Тем не менее, намного проще возложить эту работу на класс DriverManager.

Следующий код демонстрирует открытие соединения с БД, находящейся по URL «jdbc:odbc:wombat», с именем пользователя «oboy» и паролем «12Java»:

String url = «jdbc:odbc:wombat»;Connection con =DriverManager.getConnection (url, «oboy», «12Java»);

6.1.2 JDBC URL

URL (Uniform Resource Locator) представляет собой информацию для адресации ресурса в Интернет. Другими словами, это адрес ресурса. Первая часть URL задает протокол, используемый для доступа к информации, и всегда заканчивается знаком»:». Остальная часть URL, – то, что после первого двоеточия, – это то место, где находится источник данных. В случае протокола «file» оставшаяся часть URL – это путь к файлу. Для протоколов ftp и http оставшаяся часть URL идентифицирует хост и необязательный путь к конкретном сайту или файлу.

JDBC-URL предоставляет способ указания БД и определенного драйвера, который устанавливает соединение с данной БД. Стандартный синтаксис JDBC URL показан ниже. Он имеет три части, разделенных двоеточием:

jdbc:<subprotocol>:<subname>

1. jdbc – протокол, используемый в JDBC URL – всегда jdbc.

2. <subprotocol> (подпротокол) – это имя драйвера или некоего механизма установления соединения с базой данных, например, ODBC. В случае применения ODBC, в URL‑строку подставляется именно эта аббревиатура, а в качестве <subname> используется обычный DSN (Data Source Name), т.е. имя ODBC‑источника из ODBC.INI файла. Например:

3. <subname> (подимя) – это идентификатор БД. Значение подимени может менятся в зависимости от подпротокола, и может также иметь подподимя с синтаксисом, определяемым разработчиком драйвера. Назначение подимени – это предоставление всей информации, необходимой для поиска БД. Удаленная БД требует дополнительную информацию. Например, если БД находится в Интернет, то в состав подимени JDBC-URL должен быть включен сетевой адрес, подчиняющийся следующим соглашениям:

//hostname:port/subsubname

Предполагая, что «dbnet» – это протокол соединения к хосту в Интернет, JDBC-URL может выглядеть так:

jdbc:dbnet://ultra1:1789/state

Часть URL //ultra1:1789/state представляет собой и описывает имя хоста, порт и соответствующий идентификатор для доступа к соответствующей базе данных.

Примеры корректных JDBC-URL для подпротокола odbc:

jdbc:odbc:qeor7

jdbc:odbc:wombat

jdbc:odbc:wombat; CacheSize=20; ExtensionCase=LOWER

jdbc:odbc:qeora; UID=kgh; PWD=fooey

6.2 Класс Statement

6.2.1 Выполнение запроса

После того как установлено соединение, оно используется для выполнения SQL‑запросов к БД. JDBC не ограничивает синтаксис SQL‑запросов, предоставляя, таким образом, большую гибкость в использовании специфичных для СУБД запросов или даже вообще не-SQL запросов.

В JDBC есть три класса для посылки SQL‑запросов в БД и три метода в интерфейсе Connection создают экземпляры этих классов. Эти классы и методы, которые их создают, перечислены ниже:

1. Statement – создается методом createStatement. Объект Statement используется при простых SQL‑запросах.

2. PreparedStatement – создается методом prepareStatement. Объект PreparedStatement используется в SQL‑запросах с одним или более входными параметрами (IN parameters). PreparedStatement содержит группу методов, устанавливающих значения входных параметров, которые отсылаются в БД при выполнении запроса. Экземпляры класса PreparedStatement расширяют (наследуются от) Statement и, таким образом, включают методы Statement. Объект PreparedStatement потенциально может быть более эффективным, чем Statement, так как он прекомпилируется и сохраняется для будущего использования.

3. CallableStatement – создается методом prepareCall. Объекты CallableStatement используются для выполнения т.н. хранимых процедур – именованных групп SQL‑запросов, наподобие вызова подпрограммы. Объект CallableStatement наследует методы обработки входных (IN) параметров из PreparedStatement, а также добавляет методы для обработки выходных (OUT) и входных-выходных (INOUT) параметров.

Statement предоставляет три различных метода выполнения SQL‑выражений: executeQuery, executeUpdate и execute, в зависимости от SQL‑запроса.

Метод executeQuery необходим для запросов, результатом которых является один единственный набор значений, таких как запросов SELECT.

Метод executeUpdate используется для выполнения операторов INSERT, UPDATE или DELETE, а также для операторов DDL (DataDefinitionLanguage– язык определения данных), например, CREATETABLE и DROPTABLE. Результатом оператора INSERT, UPDATE, или DELETE является модификация одной или более колонок в нуле или более строках таблицы. Метод executeUpdate возвращает целое число, показывающее, сколько строк было модифицировано. Для выражений типа CREATE TABLE и DROP TABLE, которые не оперируют над строками, возвращаемое методом executeUpdate значение всегда равно нулю.

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

6.2.2 Закрытие объектов Statement

Объекты Statement закрываются автоматически с помощью сборщика мусора виртуальной машины Java. Тем не менее рекомендуется закрывать их явно после того, как в них отпадает необходимость. Закрытие объектов Statement сразу же освобождает ресурсы СУБД и позволяет избежать проблем с памятью.

6.2.3 Подстановочный (escape) синтаксис SQL в объектах Statement

Объекты Statement могут содержать SQL‑выражения с т.н. escape‑синтаксисом – синтаксисом подстановки. Escape‑конструкция сигнализирует драйверу о том, что код внутри нее должен обрабатываться особо. Драйвер сканирует выражение и находит escape‑последовательности, которые затем заменяются кодом, специфичным для данной СУБД. Escape‑синтаксис независим от СУБД и позволяет программисту использовать возможности СУБД, которые иначе никак не доступны.

Escape‑конструкция заключается в фигурные скобки и ключевое слово:

6.3 Класс CallableStatement

Объект CallableStatement предоставляет унифицированный способ вызова хранимых процедур в любой СУБД. Вызов процедуры осуществляется с помощью escape‑синтаксиса в одной из двух форм: с результирующим параметром и без него. Результирующий параметр – это один из типов выходных (OUT) параметров, являющийся возвращаемым значением хранимой процедуры. Подробное описание работы с хранимыми процедурами см. в JDK.

6.4 ResultSet

6.4.1 Обзор

ResultSet содержит все строки, удовлетворяющие условиям в SQL‑выражении и предоставляет доступ к данным в этих строках посредством набора get‑методов, которые организуют доступ к колонкам текущей строки. Метод ResultSet.next используется для перемещения к следующей строке ResultSet, делая ее текущей.

Следующий фрагмент кода демонстрирует выполнение SQL‑запроса, который возвращает коллекцию строк, в которой колонка 1 – это int, колонка 2 – String и колонка 3 – массив байтов:

java.sql. Statement stmt = conn.createStatement();ResultSet r = stmt.executeQuery («SELECT a, b, c FROM Table1»);while (r.next()){ // Напечатать значения в текущей строке.int i = r.getInt («a»);String s = r.getString («b»);float f = r.getFloat («c»);System.out.println («ROW =» + i + «» + s +» " + f);}

6.4.2 Строки и курсоры

ResultSet содержит т.н. курсор, который указывает на текущую строку данных. Каждый раз, когда выполняется метод next, курсор перемещается на одну строку вниз. Изначально курсор спозиционирован перед первой строкой, и первый вызов next премещает его на первую строку (она становится текущей). С каждым успешным вызовом next курсор перемещается вниз на одну строку, начиная с самой верхней в ResultSet.

6.4.3 Колонки

Методы getXXX предоставляют доступ к значениям в колонках в текущей строке. В пределах одной строки значения могут быть считаны в любом порядке, но ради обеспечения большей совместимости рекомендуется считывать их подряд слева направо и делать это только один раз.

Для указания колонки можно использовать либо ее имя, либо ее номер. Например, если вторая колонка объекта ResultSetrs называется «title» и хранит строковое значение, то извлечь его можно одним из двух способов:

String s = rs.getString («title»);String s = rs.getString(2);

Колонки нумеруются слева направо, начиная с 1. Имена колонок в вызове методов getXXX нечувствительны к регистру букв. Вариант с использованием имен колонок существует для того, чтобы пользователь задавал методам getXXX те же имена колонок, что он использует в запросе. Если выражение select не указывает имена колонок (например «select * from table1» или в случаях, когда колонка вычисляется) должны использоваться номера колонок. В этих случаях пользователь не может знать наверняка имена колонок.

Информацию о колонках в ResultSet можно получить с помощтю вызова ResultSet.getMetaData. Возвращаемый объект ResultSetMetaData содержит информацию о количестве, типах и свойствах колонок объекта ResultSet.

Если известно имя колонки, но не ее индекс, то для поиска номера колонки можно использовать метод findColumn.

6.4.4 Типы данных и их преобразование

Методы getXXX пытаются конвертировать низкоуровневые данные в типы данных языка Java. Например, метод если метод getXXX – это getString и тип данных в БД – VARCHAR, драйвер JDBC конвертирует VARCHAR в объект String. Возвращаемым из метода getString значением будет Java‑объект String.

7. Приложение 4. mySQL

Все следующие примеры даны для СУБД MySQL4.0.12 и драйвер MySQLODBC 3.51, для работы через ODBC API.

7.1 Установка O DBC‑драйвера для работы с mySql

MySQLAB распространяет все свои программы под General Public License (GPL). Самую свежую версию MyODBC 3.51 (двоичные коды и исходные тексты) можно скачать с http://www.mysql.com/. Подробно о MySQLODBC рассказано на http://www.mysql.com/downloads/api-myodbc.html.

После устновки MySQLследует установить драйвер MySQLODBC 3.51.

Для установки MyODBC на Windows Вы должны скачать соответствующий дистрибутивный файл для Вашей операционной системы с http://www.mysql.com/downloads/api-myodbc.html, распаковать его и выполнить файл SETUP.EXE.


8. Приложение 3. Источник данных

8.1 DSN

После установки MySql, MySQLODBC 3.51 и создания базы данных следует создать источник данных.

Источник данных идентифицирует путь для данных, который может включать сетевую библиотеку, сервер, базу данных и другие атрибуты. В нашем случае источник данных представляет собой путь к базе данных MySQL. Чтобы соединиться с источником данных, Driver Manager проверяет системный реестр Windows для получения специфической информации подключения.ODBC Driver Manager и MyODBC Drivers использует раздел системного реестра, созданный ODBC Data Source Administrator. Этот раздел содержит информацию относительно каждого источника данных и связанного с ним драйвера. Прежде, чем Вы сможете соединяться с источником данных, информация о подключении должна быть добавлена к системному реестру.

8.2 Настройка MyODBC DSN

Чтобы добавлять и конфигурировать источники данных, используйте ODBC Data Source Administrator. ODBC Administrator модифицирует информацию о подключениях к источникам данных. Поскольку Вы добавляете источники данных, ODBC Administrator модифицирует информацию системного реестра для них.

ЧтобыоткрытьODBC Administratorиз Control Panel:

· НажмитеStart, укажитенаSettingsищелкнитеControl Panel.

· Насистемахпод Microsoft Windows 2000 дваждыщелкнитепоAdministrative Tools, азатемдваждыщелкнитепоData Sources (ODBC). На компьютерах под предыдущими версиями Microsoft Windows дважды щелкните по 32‑bit ODBC или по ODBC.

Чтобы добавить источник данных в Windows:

1. ОткройтеODBC Data Source Administrator.

2. ВдиалоговомокнеODBC Data Source AdministratorнажмитеAdd. ОткроетсядиалоговоеокноCreate New Data Source.

3. Выберите там MySQLODBC 3.51 Driver и нажмите на Finish. Появится диалоговое окно MySQLODBC 3.51 Driver– DSNConfiguration.

4. В окне Data Source Name впечатайте имя источника данных, к которому Вы хотите обращаться. Это может быть любое имеющее силу имя, которое понравилось.

5. В окне Description введите описание необходимое для DSN.

6. В окне Host or Server Name (or IP) напечатайте имя сервера MySQL, к которому Вы хотите обращаться. По умолчанию это local host.

7. В окне Database Name укажите имя MySQLбазы данных, которая будет применяться как заданная по умолчанию база данных.

8. В окне User задайте имя пользователя базы данных (user ID).

9. В окне Password надо задать пароль.

10. В окне Port напечатайте номер порта, если это не значение по умолчанию 3306.

11. В окне SQL Command Вы можете вводить факультативную команду SQL, которую серверу надлежит выполнить сразу после установления подключения.

Теперь нажмите OK, чтобы добавить этот источник данных. Обратите внимание: при щелчке на OK диалоговое окно Data Sources dialog, и ODBC Administrator модифицирует информацию системного реестра. Имя пользователя и строка подключения станут заданными по умолчанию значениями подключения для этого источника данных. Вы можете также проверить, достаточны ли Ваши параметры настройки, чтобы соединиться с сервером, используя кнопку Test Data Source.

Чтобы изменить источник данных в Windows:

1. ОткройтеокноODBC Data Source Administrator.Выберите соответствующую вкладку DSN.

2. Выберите источник данных MySQL, который Вы хотите изменить, а затем нажмите modify и щелкните по Configure. Откроется диалоговое окно MySQLODBC 3.51 Driver – DSN Configuration.

3. Измените соответствующие поля источника данных, а затем нажмите OK.

По умолчанию после установки драйвера MyODBC 3.51 в системе создается UserDSN с именем myodbc3‑test, который можно использовать, не создавая своих источников данных.

9. Приложение 4. Пример программы

// Следующий код может использоваться в качестве шаблона. // Просто надо заменить соответствующие URL, login, пароль, и // SQL‑выражения на требуемые в каждой конкретной задаче строки.import java.net.URL;import java.sql.*;class SimpleSelect{public static void main (String args[]){String url = «jdbc:odbc:myodbc3‑test»;String query = «SELECT * FROM maildb.users»;try{ // Загружаемдрайвермоста jdbc-odbcClass.forName («sun.jdbc.odbc. JdbcOdbcDriver»);DriverManager.setLogStream (System.out); // Пытаемсясоединитьсясдрайвером. Идет поиск // хотя бы одного из зарегистированных // драйверов, который может обработать этот URLConnection con = DriverManager.getConnection (url, «my-user», «my-passwd»); // Если у нас не получится, то будет // сгенерировано исключение. Т.о., если мы до сюда дошли, // мы успешно соединились с URL // Посмотрим, какие замечания были сгенерированы // процедурой соединения. Выведем их.checkForWarning (con.getWarnings ()); // Получить объект DatabaseMetaData и отобразить // некоторую информацию об этом подключенииDatabaseMetaData dma = con.getMetaData ();System.out.println («\nConnected to» + dma.getURL());System.out.println («Driver» + dma.getDriverName());System.out.println («Version» + dma.getDriverVersion());System.out.println(«»); // Создаем объект Statement, чтобы можно было // отсылать SQL‑запросыкдрайверуStatement stmt = con.createStatement (); // Отсылаемзапрос, получаемобъектResultSet rs = stmt.executeQuery (query); // Показать все колонки и стороки из набора данныхdispResultSet (rs); // Закрыть набор данныхrs.close(); // Закрыть операторstmt.close(); // Закрыть соединениеcon.close();}catch (SQLException ex){ // Сгенерировалось исключение SQLException. Отловить его // и отобразить информацию об ошибке. // Заметим, что может быть несколько объектов ошибки, // соединенных вместе в одну цепочкуSystem.out.println («\n*** Поймали SQLException ***\n»);while (ex!= null){System.out.println («SQLState:» + ex.getSQLState ());System.out.println («Сообщение:» + ex.getMessage ());System.out.println («Vendor:» + ex.getErrorCode ());ex = ex.getNextException ();System.out.println («»);}}catch (java.lang. Exception ex){ // Получили ошибку другого типа. Распечатать ее.ex.printStackTrace ();}} // – // checkForWarning // Проверить, есть ли предупреждения, и отобразить их. // Возвращает true, если предупреждение есть. // –private static boolean checkForWarning (SQLWarning warn)throws SQLException{boolean rc = false; // Если дан объект SQLWarning, отобразить // сообщения о предупреждениях. Заметьте, что может быть // несколько предупреждений, связанных в цепочкуif (warn!= null){System.out.println («\n *** Warning ***\n»);rc = true;while (warn!= null){System.out.println («SQLState:» + warn.getSQLState ());System.out.println («Message:» + warn.getMessage ());System.out.println («Vendor:» + warn.getErrorCode ());System.out.println («»);warn = warn.getNextWarning ();}}return rc;} // – // dispResultSet // Отображает все колонки и строки в данном наборе данных // – private static void dispResultSet (ResultSet rs)throws SQLException{int i; // Получить ResultSetMetaData. Он нужен для // получения загловков колонокResultSetMetaData rsmd = rs.getMetaData (); // Взять количество колонок в наборе данныхint numCols = rsmd.getColumnCount (); // Показатьшапкуfor (i=1; i<=numCols; i++){if (i > 1) System.out.print(»,»);System.out.print (rsmd.getColumnLabel(i));}System.out.println(«»); // Показать все данные вплоть до конца набора данныхboolean more = rs.next ();while (more){ // Для каждой колонки в цикле: получить // ее значение и показать егоfor (i=1; i<=numCols; i++){if (i > 1) System.out.print(»,»);System.out.print (rs.getString(i));}System.out.println(«»); // Передвинуться на следующую строку набора данныхmore = rs.next ();}}}

10. Приложение 5. Компонент JTable

Компонент JTable предназначен для отображения данных в виде таблицы.

JTable только отображает данные на экране компьютера. Класс, позволяющий работать с данными и метаданными таблицы, мы унаследуем от класса AbstractTableModel. Итак, каждая таблица берет данные из табличной модели.

10.1 TableModel

Создадим табличную модель следующим образом:

import javax.swing.table. AbstractTableModel;

public class MyTableModel extends AbstractTableModel {

private String[] columnNames = { // Названияколонок

«#», «First name», «Last name», «Is Work»};

private Object[][] data = { // Данные

{new Integer(1), «Alexandr», «Fomichev», new Boolean(true)},

{new Integer(1), «Ivan», «Petrov», new Boolean(false)},

{new Integer(1), «Nikolay», «Ivanov», new Boolean(true)}};

publicintgetColumnCount() { // Выдает количество колонок

return columnNames.length;

}

public String getColumnName (int col) { // Выдаетназваниеколонки

return columnNames[col];

}

public int getRowCount() { // Выдаетколичествострок

return data.length;

}

public Object getValueAt (int row, int col) { // Выдаетзначениеячейки

return data[row] [col];

}

public Class getColumnClass (int col) { // Возвращаетклассколонки

return data[0] [col].getClass();

}

public boolean isCellEditable (int row, int col) { // Возвращает, можно

if (col > 0) // ли редактировать ячейку

returntrue;

else

return false;

}

public void setValueAt (Object v, int row, int col) { // Установкановогозначения

data[row] [col] = v;

fireTableCellUpdated (row, col);

}

}

Табличнаямодельунаследованаот AbstractTableModel, мыобязаныпереопределитьследующиеметоды: getColumnCount, getColumnName, getRowCount, getValueAt. Остальные методы можно не переопределять. Метод getColumnClass нужен нам для того, чтобы отображать колонку «Is Work» в виде checkbox, если бы мы не определили бы этот метод, в ячейке было бы написано «true» или «false». Так как мы хотим редактировать нашу таблицу, нам необходимо еще два метода: isCellEditable и setValueAt. Обратите внимание на то, что в методе setValueAt мы сообщаем таблице, что значение изменено.

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

10.2 Класс JTable

import java.awt.*;

import javax.swing.*;

public class MyTable extends JFrame {

public MyTable() {

jbInit();

}

private void jbInit() {

MyTableModel _tm = new MyTableModel();

JTable _myTable = new JTable(_tm);

JScrollPane _scrollPane = new JScrollPane(_myTable);

this.setDefaultCloseOperation (EXIT_ON_CLOSE); // чтоделатьпризакрытииокна

this.getContentPane().setLayout (new BorderLayout());

this.getContentPane().add (_scrollPane, BorderLayout.CENTER);

}

public static void main (String[] args) {

MyTable t = new MyTable();

t.setSize (300,95);

t.show();

}

}

Мы создали таблицу, указав в качестве параметра нашу табличную модель. Сама таблица размещена в контейнере JScrollPane. Если бы мы не создали JScrollPane, то естественно не добавился бы скроллинг, и мы не увидели бы названий колонок.