Ajuda em DAO

8 respostas
kvnallen

É o seguinte pessoal, estava estudando essa pattern de DAO, vi que pode-se deixar o código bem mais organizado, então comecei a fazer só que estanquei numa parte aqui e queria a ajuda de vocês, criei 2 JPS’s (index.jsp e exibe.jsp), 1 servlet, 1 classe.

No index, tem o formulario onde o usuario digita o codigo e o nome.
Exibe.jsp é onde eu quero exibir os dados cadastrados no banco.
E o resto nem preciso explicar.

Aqui vão os códigos

servletdao.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package daopackage;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author kvnallen
 */
public class servletdao extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /*
             * TODO output your page here. You may use following sample code.
             */
            
            String nome = request.getParameter("nome");
            String cod = request.getParameter("cod");
            
            
            Usuario user = new Usuario(nome, cod);
        } finally {            
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}

Usuario.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package daopackage;

/**
 *
 * @author kvnallen
 */

   

public class Usuario {
    
    
    private String nome;
    private String cod;

    public void setNome(String nome){
        this.nome = nome;
    }

    public String getNome(String nome){
        return nome;
    }
    
    public void setCod(String cod){
        this.cod = cod;
    }
    
    public String getCod(String cod){
        return cod;
    }

    
    
    public Usuario(String nome, String cod){
        
        this.setNome(nome);
        this.setCod(cod);
        
        
        
    }
    
    
    
}

A index.jsp só tem o formulário e os campos de textos chamados nome e cod.

Criei como vi num tutorial na net a classe Usuario, declarei as variaveis e criei os getters e setters, e fiz aquele método (public Usuario(String nome, String cod)) e dentro dele coloquei pra setar os valores…

Resumindo, eu queria inserir esses 2 dados no banco, o básico eu já sei, criar a classe de conexao e tal, eu geralmente insiro pelo PreparedStatement, mas se vocês souberem de outro modo podem me ajudar, quero apenas um modo melhor de organizar meu código.

Obrigado.

8 Respostas

Nicolas_Fernandes

Opa, kvnallen!
Basicamente, você fará isso:

1. Crie uma classe para representar a persistência do usuário (DAO):
public class UsuarioDAO {

}
2. Crie o método de inserção:
public class UsuarioDAO {

    public void inserir(Usuario entidadeUsuario) throws SQLException {

    }
}
3. Adicione o código de recuperação da conexão, a sua sentença SQL, a criação do PreparedStatement e boa!
public class UsuarioDAO {

    public void inserir(Usuario entidadeUsuario) throws SQLException {
    
        String sentenca = "INSERT INTO DBO.USUARIOS (NOME, COD) VALUES (?, ?)";
        Connection entidadeConnection = SuaClasseDeConexao.getConnection();

        PreparedStatement entidadeStatement = entidadeConnection.prepareStatement(sentenca);
        entidadeStatement.setString(1, entidadeUsuario.getNome());
        entidadeStatement.setString(2, entidadeUsuario.getCod());

        entidadeStatement.executeUpdate();
        entidadeStatement.close();

        entidadeConnection.close();
    }
}

Alguma dúvida?
Abraços!

kvnallen

Muito Obrigado! Funcionou perfeitamente, agora estou dando uma estudada pra entender o código! Qualquer dúvida postarei aqui.
Muito obrigado :slight_smile:

// Edit

Agora estou tentando criar um método para exibir os valores cadastrados dentro da classe UsuarioDAO

public void exibir() throws SQLException{
        
        String sql = "SELECT * FROM usuario;";
        
        Connection con = conexao.getConnection();
        
        Statement stm = con.createStatement();
        ResultSet rs = stm.executeQuery(sql);
        
        while(rs.next()){
            
        }
        
    }

No caso eu colocaria o código que eu queria ali no while(rs.next){}
Mas teria que executar no JSP apenas o uDAO.exibe(); e dentro de uma classe não tem como colocar o out.println(); pra imprimir no html…

Nicolas_Fernandes
kvnallen:
Muito Obrigado! Funcionou perfeitamente, agora estou dando uma estudada pra entender o código! Qualquer dúvida postarei aqui. Muito obrigado :)

// Edit

Agora estou tentando criar um método para exibir os valores cadastrados dentro da classe UsuarioDAO

public void exibir() throws SQLException{
        
        String sql = "SELECT * FROM usuario;";
        
        Connection con = conexao.getConnection();
        
        Statement stm = con.createStatement();
        ResultSet rs = stm.executeQuery(sql);
        
        while(rs.next()){
            
        }
        
    }

No caso eu colocaria o código que eu queria ali no while(rs.next){}
Mas teria que executar no JSP apenas o uDAO.exibe(); e dentro de uma classe não tem como colocar o out.println(); pra imprimir no html...

Você vai fazer assim: 1. Bom, você quer exibir uma coleção de usuários, certo? Então, o seu método exibir deve retornar uma coleção de usuários!
public List<Usuario> recuperarTodos() throws SQLException {

}
2. Você cria sua consulta, abre um ResultSet e itera sobre ele, do mesmo modo que fez acima:
public List<Usuario> recuperarTodos() throws SQLException {

    String sentenca = "SELECT * FROM DBO.USUARIOS";
    Connection entidadeConnection = conexao.getConnection();
    Statement entidadeStatement = entidadeConnection.createStatement(sentenca);

    ResultSet entidadeResult = entidadeStatement.executeQuery();
    List<Usuario> entidadeUsuarios = new ArrayList<Usuario>();
    while (entidadeResult.next()) {
        //...
    }
}
3. Agora, você popula sua coleção de usuários com os dados do banco de dados!
public List<Usuario> recuperarTodos() throws SQLException {

    String sentenca = "SELECT * FROM DBO.USUARIOS";
    Connection entidadeConnection = conexao.getConnection();
    Statement entidadeStatement = entidadeConnection.createStatement(sentenca);

    ResultSet entidadeResult = entidadeStatement.executeQuery();
    List<Usuario> entidadeUsuarios = new ArrayList<Usuario>();
    while (entidadeResult.next()) {
        entidadeUsuarios.add(recuperarObjeto(entidadeResult);
    }

    //NUNCA SE ESQUEÇA DE FECHAR O RESULTSET!
    entidadeResult.close();

    return entidadeUsuarios;
}

public Usuario recuperarObjeto(ResultSet entidadeResult) {
  
    Usuario entidadeUsuario = new Usuario();
    entidadeUsuario.setNome(entidadeResult.getString("NOME"));
    entidadeUsuario.setCod(entidadeResult.getString("COD"));

    return entidadeUsuario;
}

Qualquer coisa, estamos aí! ;)

rmendes08

Como você está implementando MVC o seu DAO não pode ter conhecimento de suas JSP’s, e vice-versa. O que você tem que fazer é usar o controlador (Servlet) para retornar uma lista de usuários para a sua JSP:

public List<Usuario> listUsuarios() throws SQLException{  
       
     String sql = "SELECT * FROM usuario;";  
       
     Connection con = conexao.getConnection();  
       
     Statement stm = con.createStatement();  
     ResultSet rs = stm.executeQuery(sql);  
     
     List<Usuario> usuarios = new ArrayList<>();
 
     while(rs.next()){
         Usuario u = new Usuario();
        
         u.setNome(rs.getString("NOME"));
         u.setCodigo(rs.getString("CODIGO"));

         usuarios.add(u);
     }  
      
     return usuarios;
}

O seu Servlet pode ter algo assim:

public void doGet( ... ) throws ServletException, IOException{
   UsuarioDAO usuarioDAO = new UsuarioDAO();

   List<Usuario> usuarios = usuarioDAO.listUsuarios();

   request.setAttribute("listaUsuarios", usuarios);

   request.getRequestDispatcher("listagemUsuarios.jsp").forward(request, response);
}

Por fim, vale a pena utilizar expression language e Java Standard Tag Libraries para exibir o conteúdo na JSP:

<ul>
        <c:forEach var="usuario" list="listaUsuarios" >
            <li>${usuario.codigo} - ${usuario.nome}</li>
        </c:forEach>
    </ul>
kvnallen

Nicolas Fernandes você é muito pro! hehe
Vou dar uma estudada nesse código aqui pra ver se aprendo, vou ter que ficar umas horinhas quebrando a cabeça.

Se não fosse pedir muito, você poderia explicar algumas coisinhas desse código? Exemplo, não sei porque declara um método como uma List, isso é novo pra mim ^^

Ex

public List<Usuario> recuperarTodos() throws SQLException {

Obrigado.

rmendes08

kvnallen:
Nicolas Fernandes você é muito pro! hehe
Vou dar uma estudada nesse código aqui pra ver se aprendo, vou ter que ficar umas horinhas quebrando a cabeça.

Se não fosse pedir muito, você poderia explicar algumas coisinhas desse código? Exemplo, não sei porque declara um método como uma List, isso é novo pra mim ^^

Ex

public List<Usuario> recuperarTodos() throws SQLException {

Obrigado.

Nesse caso, você precisa dar um passo para trás para andar 50 para frente. List é um tipo de objeto que representa uma lista de objetos em sequência. A sua função é parecida com a dos arrays, mas é um objeto muito mais robusto e fácil de usar. Nesse caso, ele está declarando que o método deve retornar uma lista de usuários como resultado do processamento.

Sem esses conceitos básico é bem difícil programar em Java para Web. No seu caso, o melhor a fazer é baixar uma apostila como a FJ-11 e estudar o mais básico primeiro.

kvnallen

Nesse caso, você precisa dar um passo para trás para andar 50 para frente. List é um tipo de objeto que representa uma lista de objetos em sequência. A sua função é parecida com a dos arrays, mas é um objeto muito mais robusto e fácil de usar. Nesse caso, ele está declarando que o método deve retornar uma lista de usuários como resultado do processamento.

Sem esses conceitos básico é bem difícil programar em Java para Web. No seu caso, o melhor a fazer é baixar uma apostila como a FJ-11 e estudar o mais básico primeiro.

Disso eu sei, já usei list e tal, só tava tentando entender um método do tipo list entendeu… mas acho que agora peguei.

Nicolas_Fernandes

Se atente ao post do rmendes08. Ele está te mostrando como você fará uso dos métodos DAO em uma arquitetura MVC, que acho que seja a que você está usando.
Você deve, no seu Servlet, realizar a chamada da busca que se encontra no DAO.

Eu costumo fazer uma camada a mais nesses casos: comunico meu Servlet com uma camada de serviços, e essa se comunica com a camada de persistência. No caso, crio a camada de persistência...
public class UsuarioDAO {

    public List<Usuario> recuperarTodos() throws SQLException {
        // tudo o que fizemos até agora...
    }
}
..., crio minha camada de serviços...
public class UsuarioService {

    public List<Usuario> recuperarListaDeUsuarios() throws SQLException {
        UsuarioDAO entidadePersistenciaUsuario = new UsuarioDAO();
        return entidadePersistenciaUsuario.recuperarTodos();
    }
}
... e agora sim chamo na minha Servlet:
public void doGet( ... ) throws ServletException, IOException {  
  
    UsuarioService entidadeServicosUsuario = new UsuarioService();
    List<Usuario> entidadeUsuarios = entidadeServicosUsuarios.recuperarListaDeUsuarios();

    request.setAttribute("entidadeUsuarios", entidadeUsuarios); 
    request.getRequestDispatcher("listagemUsuarios.jsp").forward(request, response);  
}

Faço isso porque tem opções que as classes de serviço oferecem que as de persistência não. Logo, disponibilizo tanto os serviços que são da persistência como os que não são nas camadas de serviço.

Abraços!

Criado 23 de fevereiro de 2012
Ultima resposta 24 de fev. de 2012
Respostas 8
Participantes 3