Como melhorar uma classe Java para conexão via JDBC

3 respostas
M

Pessoal,

Segue, abaixo, uma classe Java para conexão via JDBC.
Essa classe é utilizada em uma aplicação JSP que emite o histórico escolar da pós-graduação de uma universidade.

package br.ufpb.nti.historicoprpg2.persistence;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author MaxCarvalho
 *
 */
public class Conexao3 {
	
	private  String driver;
	private  String url;
	private  String username;
	private  String password;
	
public Conexao3() {
        
/**
* Os parametros de conexão foram omitidos por questões de privacidade e segurança.
*
*/ 
       
    	this.setDriver(""); 
    	this.setUrl("");
        this.setUsername("");
    	this.setPassword("");
    	
    	getConnection();
    
    }
    
    public void setDriver(String driver) {
		this.driver = driver;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Connection getConnection() {
		
    	Connection conn = null;
    	
		try {
			
			Class.forName(driver);
	        conn = DriverManager.getConnection(url,username,password );
			
       } catch (ClassNotFoundException cnfex) {
        
          System.err.println("Falha ao carregar o driver JDBC.");
          cnfex.printStackTrace();
          conn = null;
          return conn;
        
       } catch (SQLException sqlex) {

    	   System.err.println( "Impossivel conectar" );
           sqlex.printStackTrace();
           conn = null;
           return conn;
		}
		
       return conn;
	}
    
    public void closeConnection(Connection conn,PreparedStatement stmt,	ResultSet rs) {
		
    	if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
			}
		}
    	
		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
			}
		}	
		
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
			}
		}
		
    }	

}

Gostaria de saber de vocês mais, experientes, se tem alguma coisa que pode ser melhorada nela.
Agradece,

Max Carvalho

3 Respostas

FacaNaCaveira

Fala ai grande Max,

Cara uma coisa que seria boa, na minha opiniao, seria vc ter uma classe DAO conforme abaixo

package persistence;
import java.sql.*;

public class Dao {

    ResultSet rs;
    PreparedStatement stmt;
    Connection con;
    CallableStatement cs;

    public void open() throws Exception {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//Caso use SqlServer
        con = DriverManager.getConnection("jdbc:sqlserver://Servidor;databaseName=banco_db", "ususario", "senha");
    }

    public void close() throws Exception {
        con.close();
    }
}

e depois Criar um classe tipo HistoricoEscolarDao que herdaria essa classe DAO, aonde vc teria o metodos do seu CRUD, tendo em vista que vc criou uma classe HistoricoEscolar, resumindo

em um package entity vc teria a classe HistoricoEscolar, com os construtores, os metodos Gets e Sets e o toString
em outro package persistence vc teria a classe Dao e a classe HistoricoDAO.
A vantagem de vc ter uma classe Dao separada é que vc poderá utiliza-la em outras conexoes que precise atraves de herança.

Abaixo segue um exemplo de uma classe que criei aqui no trabalho

package persistence;
import entity.*;
import java.util.*;

public class RelatorioDao extends Dao {

    public List<Relatorio> findAcompanhamentoCorretorPmePadrao655(String dataInicial, String dataFinal) throws Exception {

        List<Relatorio> retorno = new ArrayList<Relatorio>();
        open();
        cs = con.prepareCall("cot_acompanhamento_corretor_pme_padrao_655_sps '" + dataInicial + "','" + dataFinal + "'");
        rs = cs.executeQuery();

        while (rs.next()) {
            Relatorio rel = new Relatorio();

            rel.setProduto(rs.getString("PRODUTO"));
            rel.setNomeProduto(rs.getString("NOME_PRODUTO"));
            rel.setRazaoSocial(rs.getString("RAZAO_SOCIAL"));
            rel.setCorretor(rs.getString("CORRETOR"));
            rel.setAgencia(rs.getString("AGENCIA"));
            rel.setUf(rs.getString("UF"));
            rel.setQtdSimulacao(rs.getString("QTD_SIMULACOES"));
            rel.setDataSimulacao(rs.getString("DATA_SIMULACAO"));
            rel.setVidas(rs.getString("VIDAS"));
            rel.setValorTotal(rs.getString("VALOR_TOTAL"));
            rel.setDataUltimaVisitaGin(rs.getString("DT_ULT_VISITA_GIN"));
            rel.setDescricaoStatus(rs.getString("DESCRICAO_STATUS"));
            rel.setPublicoAlvo(rs.getString("PUBLICO_ALVO"));
            rel.setRazaoSocialGin(rs.getString("RAZAO_SOCIAL_GIN"));
            retorno.add(rel);
        }
        cs.close();
        close();

        return retorno;
    }

e aqui a outra classe

package entity;

public class Relatorio {

    private String produto;
    private String nomeProduto;
    private String razaoSocial;
    private String corretor;
    private String agencia;
    private String uf;
    private String qtdSimulacao;
    private String dataSimulacao;
    private String vidas;
    private String valorTotal;
    private String dataUltimaVisitaGin;
    private String descricaoStatus;
    private String publicoAlvo;
    private String razaoSocialGin;

    public Relatorio() {
    }

    public Relatorio(String produto, String nomeProduto, String razaoSocial, String corretor, String agencia, String uf, String qtdSimulacao, String dataSimulacao, String vidas, String valorTotal, String dataUltimaVisitaGin, String descricaoStatus, String publicoAlvo, String razaoSocialGin) {
        this.produto = produto;
        this.nomeProduto = nomeProduto;
        this.razaoSocial = razaoSocial;
        this.corretor = corretor;
        this.agencia = agencia;
        this.uf = uf;
        this.qtdSimulacao = qtdSimulacao;
        this.dataSimulacao = dataSimulacao;
        this.vidas = vidas;
        this.valorTotal = valorTotal;
        this.dataUltimaVisitaGin = dataUltimaVisitaGin;
        this.descricaoStatus = descricaoStatus;
        this.publicoAlvo = publicoAlvo;
        this.razaoSocialGin = razaoSocialGin;
    }

    public String getAgencia() {
        return agencia;
    }

    public void setAgencia(String agencia) {
        this.agencia = agencia;
    }

    public String getCorretor() {
        return corretor;
    }

    public void setCorretor(String corretor) {
        this.corretor = corretor;
    }

    public String getDataSimulacao() {
        return dataSimulacao;
    }

    public void setDataSimulacao(String dataSimulacao) {
        this.dataSimulacao = dataSimulacao;
    }

    public String getDataUltimaVisitaGin() {
        return dataUltimaVisitaGin;
    }

    public void setDataUltimaVisitaGin(String dataUltimaVisitaGin) {
        this.dataUltimaVisitaGin = dataUltimaVisitaGin;
    }

    public String getDescricaoStatus() {
        return descricaoStatus;
    }

    public void setDescricaoStatus(String descricaoStatus) {
        this.descricaoStatus = descricaoStatus;
    }

    public String getNomeProduto() {
        return nomeProduto;
    }

    public void setNomeProduto(String nomeProduto) {
        this.nomeProduto = nomeProduto;
    }

    public String getProduto() {
        return produto;
    }

    public void setProduto(String produto) {
        this.produto = produto;
    }

    public String getPublicoAlvo() {
        return publicoAlvo;
    }

    public void setPublicoAlvo(String publicoAlvo) {
        this.publicoAlvo = publicoAlvo;
    }

    public String getQtdSimulacao() {
        return qtdSimulacao;
    }

    public void setQtdSimulacao(String qtdSimulacao) {
        this.qtdSimulacao = qtdSimulacao;
    }

    public String getRazaoSocial() {
        return razaoSocial;
    }

    public void setRazaoSocial(String razaoSocial) {
        this.razaoSocial = razaoSocial;
    }

    public String getRazaoSocialGin() {
        return razaoSocialGin;
    }

    public void setRazaoSocialGin(String razaoSocialGin) {
        this.razaoSocialGin = razaoSocialGin;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

    public String getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(String valorTotal) {
        this.valorTotal = valorTotal;
    }

    public String getVidas() {
        return vidas;
    }

    public void setVidas(String vidas) {
        this.vidas = vidas;
    }

}

Bem o codigo ta grande mas espero que seja util para voce. Caso nao entenda algo me diz ai que te ajudo

Abração
Max [Tambem =) ]

Priuli

Bom se for um programa web seria bom você obter a conexão de um DataSource, eu trasformaria num singleton e obteria as conexões do pool…

private JDBCConexao jdbcConexao;
    private DataSource dataSource;

    private JDBCConexao(){
        InitialContext ctx;
        try {
            ctx = new InitialContext();
            dataSource = (DataSource) ctx.lookup("java:/MeuDS");//JBOSS
            //dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/MeuDS"); //TOMCAT
   
        } catch (NamingException e) {
            System.err.println(e.toString()+":"+e.getMessage());
        }
    }

    public static JDBCConexao getJDBCConexao(){
        if(jdbcConexao== null)
            jdbcConexao= new JDBCConexao();
        return crud;
    }
   
    /**
     * Obtem uma nova conexão.
     * @return Connection
     * @throws SQLException
     */
    public Connection getConnection() throws SQLException{
        if(dataSource != null){
            return dataSource.getConnection();
        }else{
            return null;
        }
    }

Para usar… JDBCConexao.getJDBCConexao().getConnection()

Mas caso não haja necessidade de um pool apenas adicionaria um construtor que receberia todos os parâmetros para eu não ter que utilizar os sets.
O nome da classe mudaria para JDBCConnect

bombbr

maxcarvalho:
Pessoal,

Gostaria de saber de vocês mais, experientes, se tem alguma coisa que pode ser melhorada nela.
Agradece,
Max Carvalho

A classe acima só é válida para fins educacionais. Para um sistema Web profissional utilize um pool de conexões.

Criado 28 de setembro de 2010
Ultima resposta 28 de set. de 2010
Respostas 3
Participantes 4