У меня есть база данных, размер которой увеличивается, но мое приложение на Java Swing не использует Hibernate или другие фреймворки. Как я могу улучшить загрузку данных для моего JTable? Это мой код, который заполняет мою экранную таблицу, все остальные таблицы следуют этому же пути. Мой DAO работает так: я беру данные в БД, я вызываю метод стиля таблицы, чтобы установить заголовок и столбцы, а также определяемые размеры каждого столбца, после этого я вызываю tableMount, который будет проходить через набор результатов кзаполните таблицу данными. Моя проблема не в этом, а в будущем, так как эти таблицы будут расти все больше и больше, и может быть момент, что слишком много данных для извлечения из bd.
/**
* Método utilizado para setar os tamanhos e estilizar a tabela
*
* @param tabela
* @param dadosTabela
* @param cabecalho
*/
private void estiloTabela(JTable tabela, Object[][] dadosTabela, Object[] cabecalho) {
// configuracoes adicionais no componente tabela
tabela.setModel(new DefaultTableModel(dadosTabela, cabecalho) {
@Override
// quando retorno for FALSE, a tabela nao é editavel
public boolean isCellEditable(int row, int column) {
return false;
/*
if (column == 3) { // apenas a coluna 3 sera editavel
return true;
} else {
return false;
}
*/
}
// alteracao no metodo que determina a coluna em que o objeto ImageIcon devera aparecer
@Override
public Class getColumnClass(int column) {
if (column == 2) {
// return ImageIcon.class;
}
return Object.class;
}
});
// permite seleção de apenas uma linha da tabela
tabela.setSelectionMode(0);
// redimensiona as colunas de uma tabela
TableColumn column = null;
for (int i = 0; i < tabela.getColumnCount(); i++) {
column = tabela.getColumnModel().getColumn(i);
switch (i) {
case 0:
column.setPreferredWidth(17);
break;
case 1:
column.setPreferredWidth(140);
break;
case 2:
column.setPreferredWidth(100);
break;
case 3:
column.setPreferredWidth(20);
break;
case 4:
column.setPreferredWidth(45);
break;
case 5:
column.setPreferredWidth(45);
break;
case 6:
column.setPreferredWidth(30);
break;
case 7:
column.setPreferredWidth(30);
break;
case 8:
column.setPreferredWidth(30);
break;
case 9:
column.setPreferredWidth(20);
break;
case 10:
column.setPreferredWidth(30);
break;
case 11:
column.setPreferredWidth(20);
break;
case 12:
column.setPreferredWidth(20);
break;
case 13:
column.setPreferredWidth(15);
break;
}
}
}
/**
* Método utilizado para colocar informação na tabela
*
* @param lin
* @param dadosTabela
* @throws SQLException
*/
private void montaTabela(int lin, Object[][] dadosTabela) throws SQLException {
while (resultadoQ.next()) {
dadosTabela[lin][0] = resultadoQ.getInt("idpessoa");
dadosTabela[lin][1] = resultadoQ.getString("razao_social");
dadosTabela[lin][2] = resultadoQ.getString("cnpj");
dadosTabela[lin][3] = resultadoQ.getString("ie");
dadosTabela[lin][4] = resultadoQ.getString("telefone");
dadosTabela[lin][5] = resultadoQ.getString("celular");
dadosTabela[lin][6] = resultadoQ.getString("email");
dadosTabela[lin][7] = resultadoQ.getString("bairro");
dadosTabela[lin][8] = resultadoQ.getString("rua");
dadosTabela[lin][9] = resultadoQ.getString("numero");
dadosTabela[lin][10] = resultadoQ.getString("nome");
dadosTabela[lin][11] = resultadoQ.getString("uf");
dadosTabela[lin][12] = resultadoQ.getString("cep");
dadosTabela[lin][13] = resultadoQ.getString("situacao").charAt(0);
// caso a coluna precise exibir uma imagem
// if (resultadoQ.getBoolean("Situacao")) {
// dadosTabela[lin][2] = new ImageIcon(getClass().getClassLoader().getResource("Interface/imagens/status_ativo.png"));
// } else {
// dadosTabela[lin][2] = new ImageIcon(getClass().getClassLoader().getResource("Interface/imagens/status_inativo.png"));
// }
lin++;
}
}
/**
* Método utilizado na tela IfrPessoa, listando todos os itens, mesmo
* estando ativos ou não
* @param tabela
* @param criterio
*/
public void popularTabela(JTable tabela, String criterio) {
// dados da tabela
Object[][] dadosTabela = null;
// cabecalho da tabela
int qntd = 14;
Object[] cabecalho = new Object[qntd];
geraCabecalho(cabecalho);
// cria matriz de acordo com nº de registros da tabela
try {
resultadoQ = ConexaoBD.getInstance().getConnection().createStatement().executeQuery(""
+ "SELECT count(*) FROM pessoa WHERE razao_social ILIKE '%" + criterio + "%'");
resultadoQ.next();
dadosTabela = new Object[resultadoQ.getInt(1)][qntd];
} catch (Exception e) {
Log.geraLogBD(FrmPrincipal.usuarioLogado.getNome(), "popularTabela - n de registros", "PessoaDAO", e.toString());
System.out.println("Erro ao consultar pessoa: " + e);
}
int lin = 0;
// efetua consulta na tabela
try {
resultadoQ = ConexaoBD.getInstance().getConnection().createStatement().executeQuery(""
+ "SELECT p.cep, p.idpessoa, p.cnpj , p.ie, p.razao_social, p.telefone, p.email, p.bairro, p.rua, p.numero, p.cidade_idcidade, p.situacao, p.celular, c.nome, e.uf FROM pessoa p, cidade c, estado e "
+ "WHERE p.razao_social ILIKE '%" + criterio + "%' AND p.cidade_idcidade=c.idcidade AND c.estado_idestado=e.idestado "
+ "ORDER BY razao_social");
montaTabela(lin, dadosTabela);
} catch (Exception e) {
Log.geraLogBD(FrmPrincipal.usuarioLogado.getNome(), "popularTabela - final", "PessoaDAO", e.toString());
System.out.println("problemas para popular tabela...");
System.out.println(e);
}
estiloTabela(tabela, dadosTabela, cabecalho);
}
@ Редактировать: Опубликованоcode @ Edit2: выложен минимальный код