Глава 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
Назад |
Начало урока |
Вверх |
Вперед
Содержание