olá…
como faço para manipular um BD em Java? ou seja, tenho um BD, e eu devo retornar um SELECT desse BD e apresentar ao usuário…dessa seleção o usuário irá selecionar um registro, e provalvemente ele irá editar esse BD…só q nao sei como devo prosseguir…
as minhas classes estão assim:
InterfaceGráfica >>> Classe >>> ClasseDAO
sendo que InterfaceGráfica envia a solicitação para Classe, e essa para ClasseDAO, sendo que ClasseDAO retorna umResultSet para Classe e Classe envia o ResultSet para InterfaceGráfica…
na Interface Gráfica é selecionado um registro e este deverá ser editado…
eu posso editar o registro através da PK desse registro, mandando somente a PK para a Classe e esta para ClasseDAO…
até q funciona, mas existe alguma forma mais elegante de fazer esse processo?
Cliente manda a id/pk do objeto p/ a Classe, chama a consulta do DAO
DAO realiza a consulta e descarrega os dados em uma estrutura para conter o resultado (que não é uma resultset).
DAO devolve o resultado p/ a Classe, que opcionalmente faz um processamento a mais(por ex, se envolver mais DAOs), e devolve para o cliente.
Cliente edita os resultados, manda para a Classe, que valida os dados, e que chama o alterar do DAO.
DAO altera os dados, e responde para Classe se deu OK ou não, Classe, caso seja a controladora dessa alteração, commita os dados, e manda o OK para o cliente.
hum
eu queria fazer uma espécie de pesquisa:
select * from classe;
eu queria retornar os dados em uma lista…tmbm é viável será?
Com certeza
Mas nesse caso tem que ser “select campo1, campo2, campoN from etc”, os campos tem que ser definidos.
Um exemplo guardando os dados em uma lista de Map:
[code]package testes;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
-
Classe com altas mensagens subliminares
*/
public class BigMacDAO
{
private Connection conn;
public BigMacDAO(Connection conn)
{
this.conn = conn;
}
private void fecha(PreparedStatement ps, ResultSet rs)
throws SQLException
{
if (ps != null)
ps.close();
if (rs != null)
rs.close();
}
private Map<String, Object> montaBigMac(ResultSet rs)
throws SQLException
{
Map <String, Object> bigMac = new HashMap<String, Object>();
// Tudo é Long pq tudo é quantidade ;)
bigMac.put("hamburguer", rs.getLong(1)); // os numeros são
bigMac.put("tomate", rs.getLong(2)); // a posição da
bigMac.put("queijo", rs.getLong(3)); // coluna no sql
bigMac.put("molhoespecial", rs.getLong(4));
bigMac.put("cebola", rs.getLong(4));
bigMac.put("pickles", rs.getLong(5));
bigMac.put("pãogergelim", rs.getLong(6));
return bigMac;
}
public List<Map<String, Object>> buscaPorQtdHamburguer(int qtd)
throws SQLException
{
StringBuffer sql = new StringBuffer()
.append("select “)
.append(” hamburguer, “)
.append(” tomate, “)
.append(” queijo, “)
.append(” molho_especial, “)
.append(” cebola, “)
.append(” pickles, “)
.append(” pao_gergelim ")
.append("from mcd_bigmac ")
.append("where hamburguer = ? ");
PreparedStatement ps = null;
ResultSet rs = null;
try
{
ps = conn.prepareStatement(sql.toString());
ps.setLong(1, qtd); // coloca a qtd no lugar de ? na SQL
rs = ps.executeQuery();
// declaramos nossa lista
List<Map<String, Object>> lista = new ArrayList<Map<String, Object>>();
while(rs.next())
// monta os BigMacs retornados pelo select e coloca cada
// resultado em uma lista.
lista.add(montaBigMac(rs));
// Use lista.size() para saber qtos elementos tem dentro dela
// Pode ter de 0 à N. Obs: a lista nunca vai ser nula.
return lista;
}
finally
{
// Lembre-se de sempre fechar estes objetos.
// A conexão será fechada a em classes mais abaixo no stack.
fecha(ps, rs);
}
}
}[/code]
Agora, se o teu sistema começar a crescer(mais que 5 tabelas, mais de 2 consultas por DAO), use um framework de persistência que faça o trabalho p/ você. Hibernate é o melhor deles.
o que significa esse trecho de código? olhando da até pra ter noção, mas nao sei ao certo sua função…
StringBuffer sql = new StringBuffer()
.append("select ")
.append(" hamburguer, ")
.append(" tomate, ")
.append(" queijo, ")
.append(" molho_especial, ")
.append(" cebola, ")
.append(" pickles, ")
.append(" pao_gergelim ")
.append("from mcd_bigmac ")
.append("where hamburguer = ? ");
Ah, append retorna um StringBuffer com a string passada concatenada ao final. Eu somente encadeei uma concatenação atrás da outra.
É semelhante a ter um
String sql = "select " + " hamburguer, " + " tomate," + ...;
Como a string inteira é constante, o ideal mesmo era ter um
final String sql = "select hamburguer, tomate, queijo, etc... ";
Mas isso é detalhe. Só coloquei o método acima para mostrar que dá pra fazer de um jeito diferente.