Duvidas ao fazer uma consulta

14 respostas
N
eu ja usei a linguagem mysql umas vezes mas pra facilitar eu usei meus atributos tudo como Stringentao 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 !!!

14 Respostas

A

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~~

N

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

E

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…

A

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~~

N

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…

N

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…

M

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).

A

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).

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~~

M

altitdb:
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).

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~~


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.

A

marcobiscaro2112:
altitdb:
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).

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~~


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.

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~~

M

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 "Nome"; // o nome da primeira coluna
		case 1:
			return "Sobrenome"; // o nome da segunda
		case 2:
			return "Apelido"; // e o da terceira
		default:
			return ""; // 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.

T

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

S

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

S

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.

Criado 11 de janeiro de 2010
Ultima resposta 11 de jan. de 2010
Respostas 14
Participantes 7