Desta forma está correto?

Olá galera, estou fazendo um projeto para a faculdade, gostaria de saber se esta seria uma forma correta
de tratar os objetos.
Segue detalhes:
Vou tratar um objeto chamado Acesso, na verdade irá indicar quais acessos os usuários terão.
No banco tem apenas 3 campos, cod_acesso, ds_acesso e ativo, não peço avaliação do banco,
pois precisariam de maiores detalhes até mesmo da regra de ne negócio.
Bom vamos lá…

Primeiro uma fabrica de conexao onde servirá para todo meu projeto:

package br.com.preaula.odbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionFactory {	
	public static Connection getConnection() throws SQLException{       
		try {
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection("jdbc:mysql://localhost/intranet","root","contem");
		} catch (ClassNotFoundException e) {
			throw new SQLException(e.getMessage());
		}
	}
}

Segundo o objeto que será tratado:

package br.com.preaula.autentica;
public class Acesso { 
	private String descricao;
	private int codigo;
	public Acesso(String descricao){
		setDescricao(descricao);
	}
	public Acesso() {
	}
	public boolean equals(Acesso acesso){
		if(this.descricao.equals(acesso.getDescricao())){
			return true;
		}else{
			return false;
		}
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public int getCodigo() {
		return codigo;
	}
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	} 
} 

Depois uma criação de uma classe de Exception própria:

package br.com.preaula.odbc;
public class ObjetoExistente extends RuntimeException {
	public ObjetoExistente(String mensagem){
		super(mensagem);
	}
}

Por fim uma clsse DAO onde terão todas as manipulações do objeto acesso:

package br.com.preaula.autentica;

import br.com.preaula.odbc.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class AcessoDAO {
	private Connection conn;
	public ResultSet rs;
	public AcessoDAO() throws SQLException {
		//busca uma conecao na fabrica de conexao
		conn = ConnectionFactory.getConnection();
	}
	public Acesso procuraAcesso(Acesso acesso) throws SQLException {
		//cria o objeto e seta para null pq se nao for encontrado ira retornar null
		Acesso acessoAux = null;
		PreparedStatement pr;
		pr = conn.prepareStatement("select * from TBL_ACESSO where DS_ACESSO=? and ativo=1");
		pr.setString(1, acesso.getDescricao());
		rs = pr.executeQuery();
		if (rs.next()) {
			acessoAux = new Acesso();
			acessoAux.setCodigo(rs.getInt("COD_ACESSO"));
			acessoAux.setDescricao(rs.getString("DS_ACESSO"));
		}
		return acessoAux;
	}
	public void cadastraAcesso(Acesso acesso) throws SQLException, ObjetoExistente {
		if (this.procuraAcesso(acesso) != null) {			
			//passa uma exception criada por mim mesmo
			throw new ObjetoExistente("Erro: O item já consta no banco...");			
		} else {
			PreparedStatement pr = conn.prepareStatement("insert into TBL_ACESSO(ds_acesso,ativo) values(?,?)");
			pr.setString(1, acesso.getDescricao());
			pr.setString(2, "1"); //inserir por padrao o campo ativo da tabela como 1, onde indica que esta ativo
			pr.execute();
			pr.close();
			conn.close();
		}
	}
	public void removerAcesso(Acesso acesso) throws SQLException,ObjetoExistente{
		if (this.procuraAcesso(acesso) == null) {
			//passa uma exception criada por mim mesmo
			throw new ObjetoExistente("Erro: Item não consta no banco...");			
		} else {
			PreparedStatement pr = conn.prepareStatement("update TBL_ACESSO set ATIVO=0 where COD_ACESSO=?");
			pr.setInt(1, acesso.getCodigo());			
			pr.execute();
			pr.close();
			conn.close();
		}
	}
}

Vale dizer que tudo está funcionando, apenas preciso da avaliação de vcs…
A avaliação de vcs é muito importante para mim, tendo em vista que estou começando no mundo java…
Desde já agradeço o seu tempo neste tópico…

Ola,

o código esta bom para quem esta começando no mundo java.

Eh bem interessante separar as responsabilidades das classes, como vc fez. Uma ConnectionFactory, um classe do domínio (Acesso), e um DAO.

As recomendações que eu posso fazer são:

  • No método equals receba o parâmetro Object, assim: equals(Obejct o) . Para simplificar esse processo utilize o Eclipse (Source -> Generate hashCode() and equals), assim os métodos serão gerados automaticamente.

  • No método procuraAcesso , jogue uma execao ao inves de retornar null. (Retornar null deve ser a ultima opção).

  • Nos métodos do DAO utilize um bloco try-catch-finally e libere os recursos (utilizando os .close()) no bloco finally.

  • Na linha : throw new ObjetoExistente("Erro: Item não consta no banco…" ) ; Pensando na legibilidade, acredito que vale a pena criar uma outra exceção, não eh?

Abraços!

Bom Leo, ficou assim:
Uma classe meio que genérica, desta forma posso tratar todos com a mesma classe:

//imports aqui...
public class ObjetosMenoresDAO {
	private Connection conn;
	public ObjetosMenoresDAO() throws SQLException {
		// busca uma conecao na fabrica de conexao
		conn = ConnectionFactory.getConnection();
	}
	private DescreveObjeto getClasse(DescreveObjeto obj)
			throws InstantiationException, IllegalAccessException {
		DescreveObjeto novaClasse;
		novaClasse = (DescreveObjeto) obj.getClass().newInstance();
		return novaClasse;
	}
	private boolean existeObjeto(DescreveObjeto obj) {
		boolean retorno = true;
		try {
			this.procura(obj);
		} catch (ObjetoNaoExiste e) {
			retorno = false;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return retorno;
	}

	public DescreveObjeto procura(DescreveObjeto obj) throws SQLException,
			ObjetoNaoExiste {		
		PreparedStatement pr;
		ResultSet rs;
		try {
			DescreveObjeto novaClasse = getClasse(obj);
			//nao sei se é "porco" fazer desta forma mas aceito sugestoes....
			pr = conn.prepareStatement("select * from TBL_" + obj.toString()
					+ " where DS_" + obj.toString() + "=? and ativo=1");
			pr.setString(1, obj.getDescricao());
			rs = pr.executeQuery();
			if (rs.next()) {
				novaClasse.setCodigo(rs.getInt("COD_" + obj.toString()));
				novaClasse.setDescricao(rs.getString("DS_" + obj.toString()));
				rs.close();
				pr.close();
				return novaClasse;
			} else {
				throw new ObjetoNaoExiste(
						"Erro: Objeto não encontrado no banco de dados...");
			}
		} catch (InstantiationException e) {
			throw new SQLException(e);
		} catch (IllegalAccessException e) {
			throw new SQLException(e);
		}
	}
	public void cadastra(DescreveObjeto obj) throws SQLException, ObjetoExiste {
		System.out.println(obj.getDescricao());
		if (this.existeObjeto(obj)) {
			// passa uma exception criada por mim mesmo
			throw new ObjetoExiste("Erro: O item já consta no banco...");
		} else {
			PreparedStatement pr = conn.prepareStatement("insert into TBL_"
					+ obj.toString() + "(DS_" + obj.toString()
					+ ",ativo) values(?,?)");
			pr.setString(1, obj.getDescricao());
			pr.setString(2, "1"); // inserir por padrao o campo ativo da tabela
			// como 1, onde indica que esta ativo
			pr.execute();
			pr.close();
			conn.close();
		}
	}

	public void remover(DescreveObjeto obj) throws SQLException,
			ObjetoNaoExiste {
		if (!this.existeObjeto(obj)) {
			// passa uma exception criada por mim mesmo
			throw new ObjetoNaoExiste("Erro: Item não consta no banco...");
		} else {
			//obtem um obj completo com codigo, descricao
			obj = this.procura(obj);
			PreparedStatement pr = conn.prepareStatement("update TBL_"
					+ obj.toString() + " set ATIVO=0 where COD_"
					+ obj.toString() + "=?");
			pr.setInt(1, obj.getCodigo());
			pr.execute();
			pr.close();
			conn.close();
		}
	}
	public void altera(DescreveObjeto obj, DescreveObjeto objNovo)
			throws SQLException, ObjetoNaoExiste {
		if (!this.existeObjeto(obj)) {
			// passa uma exception criada por mim mesmo
			throw new ObjetoNaoExiste("Erro: Item "+obj.getDescricao()+" não consta no banco...");
		} else {
			if (this.existeObjeto(objNovo)) {
				// passa uma exception criada por mim mesmo
				throw new ObjetoExiste("Erro: Item novo '"+objNovo.getDescricao()+"' já consta no banco...");
			} else {				
				//obtem um obj completo com codigo, descricao
				obj = this.procura(obj);
				PreparedStatement pr = conn.prepareStatement("update TBL_"
						+ obj.toString() + " set DS_" + obj.toString()
						+ "=? where COD_" + obj.toString() + "="
						+ obj.getCodigo());
				pr.setString(1, objNovo.getDescricao());
				pr.execute();
				pr.close();
				conn.close();
			}
		}
	}
}

Com esta classe posso fazer as DAO simples assim:
As classes Materia, Acesso, Motivo, Submotivo dentre outras teriam esse corpo

//imports aqui...
public class MateriaDAO {
	private ObjetosMenoresDAO objetosDAO;
	public void cadastra(Materia materia) throws SQLException, ObjetoExiste{
		//Agregacao
		objetosDAO=new ObjetosMenoresDAO();
		objetosDAO.cadastra(materia);
	}
	public Materia procuraMateria(Materia materia) throws SQLException{
		//Agregacao
		objetosDAO=new ObjetosMenoresDAO();
		return (Materia) objetosDAO.procura(materia);
	}
	public void removerMateria(Materia materia) throws SQLException{
		//Agregacao
		objetosDAO=new ObjetosMenoresDAO();
		objetosDAO.remover(materia);
	}
	public void alteraMateria(Materia materia, String descricao) throws SQLException{
		//Agregacao
		objetosDAO=new ObjetosMenoresDAO();
		Materia materiaNova=new Materia(descricao);
		objetosDAO.altera(materia,materiaNova);
	}
}

… outra classe só para podermos ver o poder da classe ObjetosMenoresDAO

//imports aqui...
public class AcessoDAO {
	private ObjetosMenoresDAO objetosDAO;
	public void cadastra(Acesso acesso) throws SQLException, ObjetoExiste{
		//Agregacao
		objetosDAO=new ObjetosMenoresDAO();
		objetosDAO.cadastra(acesso);
	}
	public Acesso procuraAcesso(Acesso acesso) throws SQLException{
		//Agregacao
		objetosDAO=new ObjetosMenoresDAO();
		return (Acesso) objetosDAO.procura(acesso);
	}
	public void removerAcesso(Acesso acesso) throws SQLException{
		//Agregacao
		objetosDAO=new ObjetosMenoresDAO();
		objetosDAO.remover(acesso);
	}
	public void alteraAcesso(Acesso acesso, String descricao) throws SQLException{
		//Agregacao
		objetosDAO=new ObjetosMenoresDAO();
		Acesso acessoNova=new Acesso(descricao);
		objetosDAO.altera(acesso,acessoNova);
	}
}

Bom é isso, ufa como foi difícil chegar até aqui e ainda não sei se é a melhor forma…
fuizzzzzzz…

Eu fiz algumas mudanças no código, mas muitas melhorias ainda podem ser feitas.

[code]package br.com.guj;

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

public class ObjetosMenoresDAO {
private Connection conn;
private final String nome;
private final Class classe;

public ObjetosMenoresDAO(String nome, Class classe) {
    conn = ConnectionFactory.getConnection();
    this.nome = nome;
    this.classe = classe;
}

private boolean existe(Entidade entidade) {
	boolean retorno = true;
	try {
		this.procura(entidade.getDescricao());
	} catch (ObjetoNaoExiste e) {
		retorno = false;
	} catch (SQLException e) {
		e.printStackTrace();
	}
	return retorno;
}

public Entidade procura(String descricao) throws SQLException,
		ObjetoNaoExiste {		
	PreparedStatement pr;
	ResultSet rs;
	try {
	    Entidade result = (Entidade) classe.newInstance();
		//nao sei se é "porco" fazer desta forma mas aceito sugestoes....
                    // Leo: Esse trecho ficou estranho mesmo, talvez o melhor seja escrever esse metodo nas classe MateriaDao, etc...

		pr = conn.prepareStatement("select * from TBL_" + nome
				+ " where DS_" + descricao + "=? and ativo=1");
		pr.setString(1, descricao);
		rs = pr.executeQuery();
		if (rs.next()) {
			result.setCodigo(rs.getInt("COD_" + nome));
			result.setDescricao(rs.getString("DS_" +nome));
			rs.close();
			pr.close();
			return result;
		} else {
			throw new ObjetoNaoExiste(
					"Erro: Objeto não encontrado no banco de dados...");
		}
	} catch (InstantiationException e) {
		throw new SQLException(e);
	} catch (IllegalAccessException e) {
		throw new SQLException(e);
	}
}
public void cadastra(Entidade entidade) throws SQLException, ObjetoExiste {
	if (this.existe(entidade)) {
		// passa uma exception criada por mim mesmo
		throw new ObjetoExiste("Erro: O item já consta no banco...");
	} else {
		PreparedStatement pr = conn.prepareStatement("insert into TBL_"
				+ nome + "(DS_" + nome
				+ ",ativo) values(?,?)");
		pr.setString(1, entidade.getDescricao());
		pr.setString(2, "1"); // inserir por padrao o campo ativo da tabela
		// como 1, onde indica que esta ativo
		pr.execute();
		pr.close();
		conn.close();
	}
}

public void remover(Entidade entidade) throws SQLException,
		ObjetoNaoExiste {
	if (!this.existe(entidade)) {
		// passa uma exception criada por mim mesmo
		throw new ObjetoNaoExiste("Erro: Item não consta no banco...");
	} else {
		PreparedStatement pr = conn.prepareStatement("update TBL_"
				+ nome + " set ATIVO=0 where COD_"
				+ nome + "=?");
		pr.setInt(1, entidade.getCodigo());
		pr.execute();
		pr.close();
		conn.close();
	}
}
public void altera(Entidade entidade)
		throws SQLException, ObjetoNaoExiste {
	if (!this.existe(entidade)) {
		// passa uma exception criada por mim mesmo
		throw new ObjetoNaoExiste("Erro: Item "+entidade.getDescricao()+" não consta no banco...");
	} else {			
			PreparedStatement pr = conn.prepareStatement("update TBL_"
					+ nome + " set DS_" + nome
					+ "=? where COD_" + nome + "="
					+ entidade.getCodigo());
			pr.setString(1, entidade.getDescricao());
			pr.execute();
			pr.close();
			conn.close();
		}
	}

}[/code]

package br.com.guj; //imports aqui... public class MateriaDAO { private ObjetosMenoresDAO objetosDAO = new ObjetosMenoresDAO("Materia",Materia.class); public void cadastra(Materia materia) throws SQLException, ObjetoExiste{ objetosDAO.cadastra(materia); } public Materia procura(Materia materia) throws SQLException{ return (Materia) objetosDAO.procura(materia); } public void remover(Materia materia) throws SQLException{ objetosDAO.remover(materia); } public void altera(Materia materia) throws SQLException{ objetosDAO.altera(materia,materiaNova); } }

[code]package br.com.guj;

public interface Entidade {

void setCodigo(int codigo);

void setDescricao(String descricao);

String getDescricao();

int getCodigo();

}
[/code]