Duvidas ao fazer uma consulta

eu ja usei a linguagem mysql umas vezes… mas pra facilitar eu usei meus atributos tudo como String…
entao o meu metodo q acessava o banco de dados para fazer a consulta ele tinha como retorno um array de String …
ex do metodo: public String[] consultar(String nomeParaConsulta) throws SQLException{
}

bom agora eu estou utilizando alem de String nos meus atributos tbm inteiro e boolean…
bom a pergunta é: como eu faço essa consulta… ja q o metodo so pode ter um tipo de retorno.
pensei numa possibilidade que foi criar um arrayList pra armazenar o objeto e retornar esse arrayList…
mas antes de executar minha ideia queria consultar vcs, pois creio q vcs ja fizeram esse tipo de aplicação…

bom galera isso é tudo, desde ja obrigado… e flw !!!

Cara…

eu sempre retorno uma List lista;

por exemplo, tenho um ClienteBean onte tenho os Getter e Setters de Cliente…

crio uma List cb;

onde…

cb.getNome();

ou

cb.setNome(“altitdb”);

onde posso Usar tanto String, Boolean, Integer, Double, entre outros.

Qualquer duvida soh falar.

desculpe nao ser mto claro.

xD~~

blz cara… vc foi claro… entendi tudo

agr me responde uma pergunta… vc sabe usar o JTable ??
pq no caso do JTable tem q retornar uma matriz… exemplo String[][], pois o JTable tem linhas e colunas…
e entao como eu faco nesse caso ??

vlw pela ajuda, brigadao cara

lembrando que você também pode usar o List sem atribuir nenhuma classe… obviamente seu retorno será Object mas nada que um cast não resolva na hora de iterar os dados…

Cara… eu quebro um galho na JTable… hehe…

continuando a explicação anterior (Obrigado pelo “Foi Claro”)

List<ClienteBean> cb; //cria a List do tipo ClienteBean

cb = ClienteDao.listarClientes(); //aki vai retornar uma lista do tipo ClienteBean

String[] campos = new String [] {null, null, null};
tabela.addRow(campos);
for(int i = 0; i < cb.size(); i++){ //cb.size() verifica o tamanho da sua List
   tabela.setValue(cb.get(i).getNome(), i, 0); //linha i, coluna 0
   tabela.setValue(cb.get(i).getSobrenome(), i, 1); //linha i, coluna 1
   tabela.setValue(cb.get(i).getApelido(), i, 2); //linha i, coluna 2
}

Uma List começa a partir do 0, entao cb.get(i).getNome() onde i é a posição da sua List de ClienteBean.
Lembrando que as linhas e coluna da JTable começam a contar do 0.

xD~~

blz…
mas na verdade ainda nao fiz o codigo… pq eu ja fiz para uma aplicacao mas nessa aplicacao
eu so tinha String… eu nao estou com a aplicacao… mas abaixo vou descrever o metodo, se tiver algum erro
desculpem…

entao ficou assim
obs: usando a classe ResultSetTableModel

entao o metodo tinha como retorno o seguinte: String[][], suponhamos q seria para listar usuarios de uma locadora
o corpo do metodo era esse:

connection = DriverManager.getConnection(URL);
statement = connection.createStatement();

ResultSetTableModel rstm = new ResultSetTableModel (DRIVER, URL, “”, “”, nome, endereco, cidade);
String dados[][] = String[rstm.getRowCount()][3] //o getRowCount atualiza o numero de linhas e o 3 q eh o indice de colunas eh referente aos atributos

resultSet = statement.executeQuery(SELECT nome, endereco, cidade from usuario);
int n = 0;
while(resultSet.next()){
dados[n][0] = resultSet.getString(1);
dados[n][1] = resultSet.getString(2);
dados[n][2] = resultSet.getString(3);
n++;
}
return dados;
connection.close();
statement.close();

bom notem q dessa forma ele retorna entao essa matriz de String… sendo q agora minha aplicacao tem alem de
String… boolean e int…
agr o bixo pegou
heheheheehehheehehe
vlw glr um abraco…

muito bom cara… vlw mesmo… coloquei esse meu ultimo post sem ter visto esse codigo q vc colou ai ALTITDB…
brigadao vou dar uma analisada nesse codigo pra ve se entendo… e qualquer coisa dou o toque…

Java é orientado a objetos, não à Strings. Crie uma classe que represente aquilo que você resgata do banco de dados.

Para se trabalhar com JTable é imprescindível ter conhecimento razoável de Swing e, muito importante, crie seu próprio TableModel (não use o DefaultTableModel que só te dará complicação).

1 curtida

[quote=marcobiscaro2112]Java é orientado a objetos, não à Strings. Crie uma classe que represente aquilo que você resgata do banco de dados.

Para se trabalhar com JTable é imprescindível ter conhecimento razoável de Swing e, muito importante, crie seu próprio TableModel (não use o DefaultTableModel que só te dará complicação).[/quote]

Cara… ate hoje eu não tive problemas em usar o DefaultTableModel, não tenho muito conhecimento sobre TableModel, mais já vi alguns. Você pode me dizer alguns problemas que podem acarretar com o uso do DefaultTableModel, se souber me explicar sobre AbstractTableModel??

Vlws!!

xD~~

[quote=altitdb][quote=marcobiscaro2112]Java é orientado a objetos, não à Strings. Crie uma classe que represente aquilo que você resgata do banco de dados.

Para se trabalhar com JTable é imprescindível ter conhecimento razoável de Swing e, muito importante, crie seu próprio TableModel (não use o DefaultTableModel que só te dará complicação).[/quote]

Cara… ate hoje eu não tive problemas em usar o DefaultTableModel, não tenho muito conhecimento sobre TableModel, mais já vi alguns. Você pode me dizer alguns problemas que podem acarretar com o uso do DefaultTableModel, se souber me explicar sobre AbstractTableModel??

Vlws!!

xD~~

[/quote]
O problema é que muitas vezes traz junto com ele um código sujo, cheio de casts e sua funcionalidade é limitada (você só pode usar os métodos que já existem na classe, que muitas vezes não satisfazem as necessidades). Por exemplo, o código que você postou acima:

List<ClienteBean> cb; //cria a List do tipo ClienteBean

cb = ClienteDao.listarClientes(); //aki vai retornar uma lista do tipo ClienteBean

String[] campos = new String [] {null, null, null};
tabela.addRow(campos);
for(int i = 0; i < cb.size(); i++){ //cb.size() verifica o tamanho da sua List
   tabela.setValue(cb.get(i).getNome(), i, 0); //linha i, coluna 0
   tabela.setValue(cb.get(i).getSobrenome(), i, 1); //linha i, coluna 1
   tabela.setValue(cb.get(i).getApelido(), i, 2); //linha i, coluna 2
}

Se você tivesse um TableModel seu, você poderia criar um método adicionaLista(List) e trocar todo o trecho acima por:

modelo.adicionaLista(ClienteDao.listarClientes());

Daqui uns minutos posto um exemplo de TableModel e você verá que é mais simples que parece e torna o código mais legível e faz com que o que você precisa fazer fique mais simples.

[quote=marcobiscaro2112][quote=altitdb][quote=marcobiscaro2112]Java é orientado a objetos, não à Strings. Crie uma classe que represente aquilo que você resgata do banco de dados.

Para se trabalhar com JTable é imprescindível ter conhecimento razoável de Swing e, muito importante, crie seu próprio TableModel (não use o DefaultTableModel que só te dará complicação).[/quote]

Cara… ate hoje eu não tive problemas em usar o DefaultTableModel, não tenho muito conhecimento sobre TableModel, mais já vi alguns. Você pode me dizer alguns problemas que podem acarretar com o uso do DefaultTableModel, se souber me explicar sobre AbstractTableModel??

Vlws!!

xD~~

[/quote]
O problema é que muitas vezes traz junto com ele um código sujo, cheio de casts e sua funcionalidade é limitada (você só pode usar os métodos que já existem na classe, que muitas vezes não satisfazem as necessidades). Por exemplo, o código que você postou acima:

List<ClienteBean> cb; //cria a List do tipo ClienteBean

cb = ClienteDao.listarClientes(); //aki vai retornar uma lista do tipo ClienteBean

String[] campos = new String [] {null, null, null};
tabela.addRow(campos);
for(int i = 0; i < cb.size(); i++){ //cb.size() verifica o tamanho da sua List
   tabela.setValue(cb.get(i).getNome(), i, 0); //linha i, coluna 0
   tabela.setValue(cb.get(i).getSobrenome(), i, 1); //linha i, coluna 1
   tabela.setValue(cb.get(i).getApelido(), i, 2); //linha i, coluna 2
}

Se você tivesse um TableModel seu, você poderia criar um método adicionaLista(List) e trocar todo o trecho acima por:

modelo.adicionaLista(ClienteDao.listarClientes());

Daqui uns minutos posto um exemplo de TableModel e você verá que é mais simples que parece e torna o código mais legível e faz com que o que você precisa fazer fique mais simples.[/quote]

Vlws pela explicação, se puder postar o seu ex de TableModel eu agradeço…
eu tenho um exemplo aqui, mais sem comentarios :S …

xD~~

Bom, aqui vai um TableModel bem comentado e em anexo está um exemplo de como usá-lo (só não postei tudo aqui por causa do tamanho das classes). Creio que esses exemplos possam ajudar quem ainda tem dúvida quanto à TableModel. A classe:

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

/**
 * A interface {@link TableModel} define 9 métodos, sendo que 2 deles cuidam da
 * parte de listeners. Esses dois métodos (addTableModelListener e
 * removeTableModelListener) nós delegaremos para a classe
 * {@link AbstractTableModel}. Os outros 7 nós implementaremos. Uma pequena
 * explicação de cada um deles (para mais detalhes, consulte a documentação):<br>
 * <ul>
 * <li>getColumnClass: retorna a classe de determinada coluna. Útil para os
 * renderers saberem como exibir determinada informação.</li>
 * <li>getColumnCount: retorna o número de colunas que nossa tabela terá
 * (geralmente é o número de atributos do objeto que será exibido).</li>
 * <li>getColumnName: retorna o nome da coluna. Será usado no cabeçalho da
 * tabela.</li>
 * <li>getRowCount: retorna o número de registros. Geralmente é a quantidade de
 * elementos que há em nossa lista.</li>
 * <li>getValueAt: retorna o valor que está contido em determinada célula. Para
 * resgatarmos esse valor, primeiro pegamos o objeto da linha e depois, a partir
 * do número da coluna, retornamos uma de suas propriedades.</li>
 * <li>isCellEditable: informa se determinada célula pode ser editada ou não.</li>
 * <li>setValueAt: é chamado quanto o valor de determinada célula é alterada.
 * Devemos modificar nosso objeto para refletir essa mudança.</li>
 * </ul>
 */
public class ClienteTableModel extends AbstractTableModel {

	private static final long serialVersionUID = 1L;

	/**
	 * Essa lista armazenará os objetos do tipo {@link Cliente} atualmente
	 * exibidos na tablela.
	 */
	private List&lt;Cliente&gt; clientes;

	// ==============================================================
	// Construtores.
	// ==============================================================

	/**
	 * Constutor que simplesmente instancia o nosso {@link List} que usaremos
	 * para guardar os valores.
	 */
	public ClienteTableModel() {
		// no construtor, instanciamos o List
		clientes = new ArrayList&lt;Cliente&gt;();
	}

	/**
	 * Criamos um construtor de conveniência para já popular a lista.
	 * 
	 * @param lista
	 *            a lista de clientes a ser adicionada.
	 */
	public ClienteTableModel(List&lt;Cliente&gt; lista) {
		this();
		clientes.addAll(lista);
	}

	// ==============================================================
	// Métodos implementados.
	// ==============================================================

	@Override
	public Class&lt;?&gt; getColumnClass(int coluna) {
		// todas as colunas representam uma String
		return String.class;
	}

	@Override
	public int getColumnCount() {
		// esse método deve retornar o número de colunas. No caso, 3 (uma para o
		// nome, uma para o sobrenome e uma para o apelido).
		return 3;
	}

	@Override
	public String getColumnName(int coluna) {
		// vamos retornar o nome de cada coluna
		switch (coluna) {
		case 0:
			return &quot;Nome&quot;; // o nome da primeira coluna
		case 1:
			return &quot;Sobrenome&quot;; // o nome da segunda
		case 2:
			return &quot;Apelido&quot;; // e o da terceira
		default:
			return &quot;&quot;; // isso nunca deve ocorrer, pois temos só 3 colunas
		}
	}

	@Override
	public int getRowCount() {
		// retorna o número de linhas, ou seja, a quantidade de entradas na
		// nossa lista.
		return clientes.size();
	}

	@Override
	public Object getValueAt(int linha, int coluna) {
		// vai retornar o valor de determinada célula. A linha representa a
		// posição do Cliente na nossa lista e a coluna vai ser: 1 - nome, 2 -
		// sobrenome e 3 - apelido
		// primeiro vamos pegar o Cliente da linha
		Cliente c = clientes.get(linha);
		// façamos um switch
		switch (coluna) {
		case 0:
			return c.getNome(); // retornamos o nome
		case 1:
			return c.getSobrenome(); // retornamos o sobrenome
		case 2:
			return c.getApelido(); // e o apelido
		default:
			return null; // isso nunca deve ocorrer, pois temos só 3 colunas
		}
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		// nesse caso, todas as células são editáveis
		return true;
	}

	@Override
	public void setValueAt(Object valor, int linha, int coluna) {
		// aqui devemos atualizar o valor de nossos Clientes
		// vemos em qual linha ele está
		Cliente c = clientes.get(linha);
		// e vemos o que será atualizado
		switch (coluna) {
		case 0:
			c.setNome(valor.toString()); // mudamos o nome
			break;
		case 1:
			c.setSobrenome(valor.toString()); // mudamos o sobrenome
			break;
		case 2:
			c.setApelido(valor.toString()); // e o apelido
			break;
		}
		// é importante notificar os listeners a cada alteração
		fireTableDataChanged();
	}

	// ==============================================================
	// Até aqui seria o mínimo necessário para um TableModel funcional, mas
	// ainda não há métodos para adicionar, remover ou resgatar objetos. Vamos
	// criá-los.
	// ==============================================================

	/**
	 * Adiciona um novo {@link Cliente} e notifica os listeners que um novo
	 * registro foi adicionado.
	 */
	public void adiciona(Cliente c) {
		clientes.add(c);
		// informamos os listeners que a linha (size - 1) foi adicionada
		fireTableRowsInserted(clientes.size() - 1, clientes.size() - 1);
	}

	/**
	 * Similar ao {@link #adiciona(Cliente)}, porém para remover. Recebe o
	 * índice do cliente a ser removido. Se não souber o índice, use o método
	 * {@link #getIndice(Cliente)} antes.
	 */
	public void remove(int indice) {
		clientes.remove(indice);
		fireTableRowsDeleted(indice, indice);
	}

	/**
	 * Retorna o índice de determinado cliente.
	 */
	public int getIndice(Cliente c) {
		return clientes.indexOf(c);
	}

	/**
	 * Adiciona todos os clientes na lista à este modelo.
	 */
	public void adicionaLista(List&lt;Cliente&gt; lista) {
		int i = clientes.size();
		clientes.addAll(lista);
		fireTableRowsInserted(i, i + lista.size());
	}

	/**
	 * Esvazia a lista.
	 */
	public void limpaLista() {
		int i = clientes.size();
		clientes.clear();
		fireTableRowsDeleted(0, i - 1);
	}

}

Se tirarmos os comentários, a classe terá menos de 110 linhas (nada muito absurdo). Agora vamos discutir as capacidades dessa classe. Para exemplificar, vamos tratar de 2 situações usando o exemplo em anexo:

  1. A tabela deve estar ordenada.

Fazer isso com DefaultTableModel seria simplesmente inviável. Com nosso TableModel, tudo que temos que fazer é criar um método para ordenar a lista na nossa classe que extende AbstractTableModel:

public void ordenaLista() {    

	Collections.sort(clientes);

}                              

E, no método tableChanged do nosso TableModelListener, chamaríamos o método ordenaLista():

public void tableChanged(TableModelEvent e) {
	modelo.ordenaLista();
	// continua....
}

Pronto! Temos uma lista ordenada.

  1. Não queremos que o sobrenome seja editável. Basta mudarmos o método isCellEditable(int, int) para que, ao invés de retornar sempre true, retorne true somente se a coluna for diferente de 1:
public boolean isCellEditable(int rowIndex, int columnIndex) {
	return columnIndex != 1;
}

Percebe como é simples fazer coisas que seriam muito complexas? Podemos também trabalhar com Map ou arrays no nosso Model. Vai depender da necessidade. E depois que você entende como criar seu Model percebe que é muito mais interessante do que fazer aquele monte de casts ou gambiarras no meio do código. Espero que ajude.

1 curtida

Algum exemplo deste tablemodel usando componentes checkbox ou combobox dentro das celulas e tambem sendo alimentados pelo banco de dados??

So revivendo esse topico com uma pergunda idiota, no switch ali está faltando os breaks? Não ne? Pq já retorna nos return certo?

Amigo,

os registros da JTable são de que tipo de objeto?

Basta vc retornar um List.

Qualquer coisa coloca o codigo aí que a gente tenta de ajudar.