Два года назад, когда я учился в техническом училище, я написал небольшую библиотеку, помогающую решить некоторые проблемы, предложенные в упражнениях, в том числе DatabaseTableModel
.
Класс расширяется от AbstractTableModel
, , что означает, что вы можете установить его в качестве источника данных вашего JTable
.
Вот алгоритм, который строит модель из ResultSet
:
public final void constructModel(ResultSet rs) throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
rs.last();
rowCount = rs.getRow();
int columnCount = rsmd.getColumnCount();
// DatabaseColumn simply holds a name and a Class<?>.
columns = new DatabaseColumn[columnCount];
// This is the Object[][] array that you were talking about.
// It holds all the data from the ResultSet.
data = new Object[columnCount][rowCount];
for (int i = 0; i < columnCount; ++i) {
// Figure out the column name and type.
int j = i + 1;
String colName = rsmd.getColumnLabel(j);
Class<?> colClass = String.class;
try {
colClass = Class.forName(rsmd.getColumnClassName(j));
} catch (ClassNotFoundException ex) {
colClass = String.class;
}
columns[i] = new DatabaseColumn(colName, colClass);
// Get the data in the current column as an Object.
rs.beforeFirst();
for (int k = 0; rs.next(); ++k) {
data[i][k] = rs.getObject(j);
}
}
// Notify listeners about the changes so they can update themselves.
fireTableStructureChanged();
}
Класс работал, когда я использовал его в школе, но это не совсем рабочий код. Когда я смотрю на это сегодня, я начинаю видеть проблемы.
Одной из проблем является то, что он загружает все содержимое ResultSet
в память. Может довольно быстро стать уродливым.
Кроме того, алгоритм не совсем оптимален. Он зацикливается на курсоре базы данных, как если бы он был ничем; Я предполагаю , что для базы данных было бы дешевле, если бы она сначала извлекла все объекты в текущей строке и присвоила их соответствующим столбцам , а затем перешла к следующей строке.
Тем не менее, я думаю, что это достаточно хорошая отправная точка.