Смекни!
smekni.com

Работа с базами данных (стр. 3 из 3)

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 («&bsol;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 («&bsol;n*** Поймали SQLException ***&bsol;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 («&bsol;n *** Warning ***&bsol;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, то естественно не добавился бы скроллинг, и мы не увидели бы названий колонок.