Como melhorar uma classe Java para conexão via JDBC

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

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 =) ]

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

[quote=maxcarvalho]Pessoal,

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

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