Назад | Начало урока | Вперед
Содержание

Глава 8

Модель таблицы по Дейтелу

Теперь, когда мы познакомились с моделью для таблиц Ивана Портянкина,
посмотрим модель Дейтела (см. Дейтел "Как программировать на Java" глава 9).
Для того, чтобы можно было сравнить и сделать для себя некоторые выводы.

Модель таблицы, передающая данные ResultSet в компонент JTable.


// Fig. 20.25: ResultSetTableModel.java
// A TableModel that supplies ResultSet data to a JTable.
import java.sql.Connection;
import java.sql.Statement;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import javax.swing.table.AbstractTableModel;

// ResultSet rows and columns are counted from 1 and JTable
// rows and columns are counted from 0. When processing
// ResultSet rows or columns for use in a JTable, it is
// necessary to add 1 to the row or column number to manipulate
// the appropriate ResultSet column (i.e., JTable column 0 is
// ResultSet column 1 and JTable row 0 is ResultSet row 1).

public class ResultSetTableModel extends AbstractTableModel {

private Connection connection;
private Statement statement;
private ResultSet resultSet;
private ResultSetMetaData metaData;
private int numberOfRows;

// отслеживает статус соединения с БД
private boolean connectedToDatabase = false;

// инициализировать resultSet и получить его метаданные;
// определить число строк
public ResultSetTableModel(String url, String username, String password, String query)

throws SQLException, ClassNotFoundException{

// соединиться с БД
connection = DriverManager.getConnection(url, username, password );
// создать объект Statement для запроса к БД
statement = connection. createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY );

// обновить флаг состояния
connectedToDatabase = true;
// установить запрос и исполнить его
setQuery( query );

}

//-------------------------------------------------------
// получить класс, представляющий тип данных колонки
public Class getColumnClass(int column) throws IllegalStateException {

// убедиться, что БД доступна
if ( !connectedToDatabase )
throw new IllegalStateException( "Not Connected to Database" );
// определить Java-class колонки
try {
String className = metaData.getColumnClassName( column + 1 );
// возвратить объект Class представляющий className
return Class.forName( className );
}
catch ( Exception exception ) {
exception.printStackTrace();
}
// если выше возникли проблемы, предположить тип Object
return Object.class;
}

//-------------------------------------------
// получение числа столбцов в ResultSet
public int getColumnCount() throws IllegalStateException {

// убедиться, что БД доступна
if ( !connectedToDatabase )
throw new IllegalStateException( "Not Connected to Database" );
// определить число столбцов
try {
return metaData.getColumnCount();
}
catch ( SQLException sqlException ) {
sqlException.printStackTrace();
}
return 0; // если выше возникли ошибки, возвратить 0 для числа столбцов
}

//---------------------------------------------------
// получить имя указанного столбца в ResultSet
public String getColumnName( int column ) throws IllegalStateException {

// ensure database connection is available
if ( !connectedToDatabase )
throw new IllegalStateException( "Not Connected to Database" );
// determine column name
try {
return metaData.getColumnName( column + 1 );
}
catch ( SQLException sqlException ) {
sqlException.printStackTrace();
}
// if problems, return empty string for column name
return "";
}

//------------------------------------------
// возвращает число строк в ResultSet
public int getRowCount() throws IllegalStateException {

// ensure database connection is available
if ( !connectedToDatabase )
throw new IllegalStateException( "Not Connected to Database" );
return numberOfRows;
}

//------------------------------------------------------
// получить значение в указанных строке и столбце
public Object getValueAt( int row, int column ) throws IllegalStateException {

// ensure database connection is available
if ( !connectedToDatabase )
throw new IllegalStateException( "Not Connected to Database" );

// obtain a value at specified ResultSet row and column
try {

resultSet.absolute( row + 1 );
return resultSet.getObject( column + 1 );
}
catch ( SQLException sqlException ) {
sqlException.printStackTrace();
}
// if problems, return empty string object
return "";
}

//--------------------------------------
// установить новую строку запроса к БД
public void setQuery( String query ) throws SQLException, IllegalStateException {

// убедиться, что БД доступна
if ( !connectedToDatabase )
throw new IllegalStateException( "Not Connected to Database" );

// специфицировать и исполнить запрос
resultSet = statement.executeQuery( query );

// получить метаданные для ResultSet
metaData = resultSet.getMetaData();

// перейти в последнюю строку
resultSet.last();

// определить число строк в ResultSet
numberOfRows = resultSet.getRow();

// уведомить JTable об изменении таблицы
fireTableStructureChanged();

}

//--------------------------------------
// close Statement and Connection
public void disconnectFromDatabase() {

if ( connectedToDatabase ) {
// close Statement and Connection
try {
resultSet.close();
statement.close();
connection.close();
}
catch ( SQLException sqlException ) {
sqlException.printStackTrace();
}
finally // update database connection status {
connectedToDatabase = false;
} // end finally
} // end if
}

} // end class ResultSetTableModel



Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz