Manipulando BD em Java

5 respostas
J

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?

5 Respostas

B

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.

J

hum
eu queria fazer uma espécie de pesquisa:
select * from classe;
eu queria retornar os dados em uma lista…tmbm é viável será?

B

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:
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);
        }
    }
}

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.

T

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 = ? ");
B

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.

Criado 3 de junho de 2008
Ultima resposta 4 de jun. de 2008
Respostas 5
Participantes 3