ледующий фрагмент кода демонстрирует выполнение 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 предоставляют доступ к значениям в колонках в текущей строке. В пределах одной строки значения могут быть считаны в любом порядке, но ради обеспечения большей совместимости рекомендуется считывать их подряд слева направо и делать это только один раз.Для указания колонки можно использовать либо ее имя, либо ее номер. Например, если вторая колонка объекта ResultSet rs называется «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 Установка ODBC_драйвера для работы с mySqlMySQLAB распространяет все свои программы под 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 - DSN Configuration. 4. В окне Data Source Name впечатайте имя источника данных, к которому Вы хотите обращаться. Это может быть любое имеющее силу имя, которое понравилось. 5. В окне Description введите описание необходимое для DSN. 6. В окне Host or Server Name (or IP) напечатайте имя сервера MySQL, к которому Вы хотите обращаться. По умолчанию это local host. 7. В окне Database Name укажите имя MySQLбазы данных, которая будет применяться как заданная по умолчанию база данных. 8. В окне User задайте имя пользователя базы данных (user ID). 9. В окне Password надо задать пароль. 10. В окне Port напечатайте номер порта, если это не значение по умолчанию 3306. 11. В окне SQL Command Вы можете вводить факультативную команду SQL, которую серверу надлежит выполнить сразу после установления подключения. Теперь нажмите OK, чтобы добавить этот источник данных. Обратите внимание: при щелчке на OK диалоговое окно Data Sources dialog, и ODBC Administrator модифицирует информацию системного реестра. Имя пользователя и строка подключения станут заданными по умолчанию значениями подключения для этого источника данных. Вы можете также проверить, достаточны ли Ваши параметры настройки, чтобы соединиться с сервером, используя кнопку Test Data Source. Чтобы изменить источник данных в Windows: 1. Откройте окно ODBC Data Source Administrator. Выберите соответствующую вкладку DSN. 2. Выберите источник данных MySQL, который Вы хотите изменить, а затем нажмите modify и щелкните по Configure. Откроется диалоговое окно MySQLODBC 3.51 Driver - DSN Configuration. 3. Измените соответствующие поля источника данных, а затем нажмите OK. По умолчанию после установки драйвера MyODBC 3.51 в системе создается User DSN с именем myodbc3_test, который можно использовать, не создавая своих источников данных. 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-odbc Class.forName («sun.jdbc.odbc. JdbcOdbcDriver»); DriverManager.setLogStream (System.out); // Пытаемся соединиться с драйвером. Идет поиск // хотя бы одного из зарегистированных // драйверов, который может обработать этот URL Connection con = DriverManager.getConnection ( url, «my-user», «my-passwd»); // Если у нас не получится, то будет // сгенерировано исключение. Т.о., если мы до сюда дошли, // мы успешно соединились с URL // Посмотрим, какие замечания были сгенерированы // процедурой соединения. Выведем их. checkForWarning (con.getWarnings ()); // Получить объект DatabaseMetaData и отобразить // некоторую информацию об этом подключении DatabaseMetaData dma = con.getMetaData (); System.out.println («\nConnected to» + dma.getURL()); System.out.println («Driver» + dma.getDriverName()); System.out.println («Version» + dma.getDriverVersion()); System.out.println(«»); // Создаем объект Statement, чтобы можно было // отсылать SQL_запросы к драйверу Statement stmt = con.createStatement (); // Отсылаем запрос, получаем объект ResultSet rs = stmt.executeQuery (query); // Показать все колонки и стороки из набора данных dispResultSet (rs); // Закрыть набор данных rs.close(); // Закрыть оператор stmt.close(); // Закрыть соединение con.close(); } catch (SQLException ex) { // Сгенерировалось исключение SQLException. Отловить его // и отобразить информацию об ошибке. // Заметим, что может быть несколько объектов ошибки, // соединенных вместе в одну цепочку System.out.println («\n*** Поймали SQLException ***\n»); while (ex!= null) { System.out.println («SQLState:» + ex.getSQLState ()); System.out.println («Сообщение:» + ex.getMessage ()); System.out.println («Vendor:» + ex.getErrorCode ()); ex = ex.getNextException (); System.out.println («»); } } catch (java.lang. Exception ex) { // Получили ошибку другого типа. Распечатать ее. ex.printStackTrace (); } } // - // checkForWarning // Проверить, есть ли предупреждения, и отобразить их. // Возвращает true, если предупреждение есть. // - private static boolean checkForWarning (SQLWarning warn) throws SQLException { boolean rc = false; // Если дан объект SQLWarning, отобразить // сообщения о предупреждениях. Заметьте, что может быть // несколько предупреждений, связанных в цепочку if (warn!= null) { System.out.println («\n *** Warning ***\n»); rc = true; while (warn!= null) { System.out.println («SQLState:» + warn.getSQLState ()); System.out.println («Message:» + warn.getMessage ()); System.out.println («Vendor:» + warn.getErrorCode ()); System.out.println («»); warn = warn.getNextWarning (); } } return rc; } // - // dispResultSet // Отображает все колонки и строки в данном наборе данных // - private static void dispResultSet (ResultSet rs) throws SQLException { int i; // Получить ResultSetMetaData. Он нужен для // получения загловков колонок ResultSetMetaData rsmd = rs.getMetaData (); // Взять количество колонок в наборе данных int numCols = rsmd.getColumnCount (); // Показать шапку for (i=1; i<=numCols; i++) { if (i > 1) System.out.print(»,»); System.out.print (rsmd.getColumnLabel(i)); } System.out.println(«»); // Показать все данные вплоть до конца набора данных boolean more = rs.next (); while (more) { // Для каждой колонки в цикле: получить // ее значение и показать его for (i=1; i<=numCols; i++) { if (i > 1) System.out.print(»,»); System.out.print (rs.getString(i)); } System.out.println(«»); // Передвинуться на следующую строку набора данных more = rs.next (); } } } 10. Приложение 5. Компонент JTableКомпонент JTable предназначен для отображения данных в виде таблицы. JTable только отображает данные на экране компьютера. Класс, позволяющий работать с данными и метаданными таблицы, мы унаследуем от класса AbstractTableModel. Итак, каждая таблица берет данные из табличной модели. 13 10.1 TableModelСоздадим табличную модель следующим образом: // Файл MyTableModel.javaimport javax.swing.table. AbstractTableModel;public class MyTableModel extends AbstractTableModel {private String[] columnNames = { // Названия колонок«#», «First name», «Last name», «Is Work»};private Object[][] data = { // Данные{new Integer(1), «Alexandr», «Fomichev», new Boolean(true)},{new Integer(1), «Ivan», «Petrov», new Boolean(false)},{new Integer(1), «Nikolay», «Ivanov», new Boolean(true)}};public int getColumnCount() { // Выдает количество колонокreturn columnNames.length;}public String getColumnName (int col) { // Выдает название колонкиreturn columnNames[col];}public int getRowCount() { // Выдает количество строкreturn data.length;}public Object getValueAt (int row, int col) { // Выдает значение ячейкиreturn data[row] [col];}public Class getColumnClass (int col) { // Возвращает класс колонкиreturn data[0] [col].getClass();}public boolean isCellEditable (int row, int col) { // Возвращает, можноif (col > 0) // ли редактировать ячейкуreturn true;elsereturn false;}public void setValueAt (Object v, int row, int col) { // Установка нового значенияdata[row] [col] = v;fireTableCellUpdated (row, col);}}Табличная модель унаследована от AbstractTableModel, мы обязаны переопределить следующие методы: getColumnCount, getColumnName, getRowCount, getValueAt. Остальные методы можно не переопределять. Метод getColumnClass нужен нам для того, чтобы отображать колонку «Is Work» в виде checkbox, если бы мы не определили бы этот метод, в ячейке было бы написано «true» или «false». Так как мы хотим редактировать нашу таблицу, нам необходимо еще два метода: isCellEditable и setValueAt. Обратите внимание на то, что в методе setValueAt мы сообщаем таблице, что значение изменено.Теперь давайте отобразим нашу таблицу, используя только что созданную табличную модель.10.2 Класс JTable // Файл MyTable.java import java.awt.*; import javax.swing.*; public class MyTable extends JFrame { public MyTable() { jbInit(); } private void jbInit() { MyTableModel _tm = new MyTableModel(); JTable _myTable = new JTable(_tm); JScrollPane _scrollPane = new JScrollPane(_myTable); this.setDefaultCloseOperation (EXIT_ON_CLOSE); // что делать при закрытии окна this.getContentPane().setLayout (new BorderLayout()); this.getContentPane().add (_scrollPane, BorderLayout.CENTER); } public static void main (String[] args) { MyTable t = new MyTable(); t.setSize (300,95); t.show(); } } Мы создали таблицу, указав в качестве параметра нашу табличную модель. Сама таблица размещена в контейнере JScrollPane. Если бы мы не создали JScrollPane, то естественно не добавился бы скроллинг, и мы не увидели бы названий колонок.
Страницы: 1, 2
|