Funcionar funciona, MAS

Gente, seguinte… consegui finalmente colocar um CRUD pra funcionar com MVC, só que tem algo de estranho…

Seguinte: Toda vez que faço uma transação no DAO tenho que abrir a transação, conectar no jdbc, etc. etc.

Teria como otimizar esse código? Alguem poderia por gentileza ajudar o amigo? :smiley:

package DAO;

import MODELO.Usuario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DAOUsuario {

Connection conn = null;
PreparedStatement stmt = null;

public void inserir (Usuario usuario) throws SQLException
{
    String sql = "insert into usuarios (nome, email, login, senha) values (?,?,?,?)";        

    try {
        //repito esse bloco inteiro
        Class.forName("org.postgresql.Driver");
        conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/CRUD","postgres","");

        stmt = conn.prepareStatement(sql);
        stmt.setString(1, usuario.getNome());
        stmt.setString(2, usuario.getEmail());
        stmt.setString(3, usuario.getLogin());
        String senha = String.valueOf(usuario.getSenha());
        stmt.setString(4, senha);
        // até aqui
        stmt.execute();

        // e o restante até fechar a ultima chave
        } 
    catch(ClassNotFoundException e) 
    {
    e.printStackTrace();
    }         
    catch(SQLException e) 
    {
        e.printStackTrace();
    }
    finally 
    {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    if (conn != null) {
        conn.close();
    }
    
}
public void editar (Usuario usuario) throws SQLException
{
    String sql = "update usuarios set nome = ?, email = ?, login = ?, senha = ? where codigo = ?";
    
    try {

        Class.forName("org.postgresql.Driver");
        conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/CRUD","postgres","");

        stmt = conn.prepareStatement(sql);
        stmt.setString(1, usuario.getNome());
        stmt.setString(2, usuario.getEmail());
        stmt.setString(3, usuario.getLogin());
        String senha = String.valueOf(usuario.getSenha());
        stmt.setString(4, senha);
        stmt.executeUpdate();

        } 
    catch(ClassNotFoundException e) 
    {
    e.printStackTrace();
    }         
    catch(SQLException e) 
    {
        e.printStackTrace();
    }
    finally 
    {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    if (conn != null) {
        conn.close();
    }
    
}    

}

Abraços,

Alessandro.

Olá, boa noite! Dá uma olha nesse link: http://desenvolvedoresfanaticos.blogspot.com.br/2012/07/injecao-de-dependencias-com-cdi.html

explica direitinho o que você quer usar, é antigo mais vale a pena, procura estudar sobre CDI

Bons estudos!

Tem sim usando o padrão singletom.

Da Uma Olhada no Link

Olha Esse Outro Tambem

Tem as dicas que o pessoal deu, e eu particularmente gosto muito de um framework de persistencia, que se chama mybatis :slight_smile: da uma procurada se quiser

Cara toda essa parte de

try {
    Class.forName("org.postgresql.Driver");
    conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/CRUD","postgres","");

deveria ser uma só, poderia retornar o conn, simplificando algo tipo isso:

public Connection void getConn() {

if(conn == null) {
Class.forName(“org.postgresql.Driver”);
conn = DriverManager.getConnection(“jdbc:postgresql://localhost:5432/CRUD”,“postgres”,"");
}

return conn;

}

e ai na parte de inserir o usuário

String sql = “insert into usuarios (nome, email, login, senha) values (?,?,?,?)”;
Está parte de sql pode ser fora da função

try {
    stmt = getConn().prepareStatement(sql);
    stmt.setString(1, usuario.getNome());
    stmt.setString(2, usuario.getEmail());
    stmt.setString(3, usuario.getLogin());
    String senha = String.valueOf(usuario.getSenha());
    stmt.setString(4, senha);
    // até aqui
    stmt.execute();
    // e o restante até fechar a ultima chave
    } 

só ai vc já parou de repetir 4 linhas e reutiliza o conn que ta global pelo jeito, o resto é gosto, e jogar todas as variáveis para fora da função, então você só às reutilizaria, só a parte do stmt que teria que repetir mesmo(a menos que utilize um ORM), agora a parte que “CONECTA” no banco de dados, pode ser uma só e ele te retorna a instância, se for null cria primeiro e retorna

segue o que o pessoal postou,

Opa, Obrigado pessoal! Vou ver todas as respostas e identificar a melhor pro meu contexto.

Abraços

Alessandro.