InterfaceDAO mais genérica é possível?

public interface InterfaceLivrosDAO {
	
	void atualizar(Livros livro)throws LivrariaDAOException;
	
	void excluir(Livros livro)throws LivrariaDAOException;
	
	void salvar(Livros livro)throws LivrariaDAOException;
	
	List<Livros>todosLivros()throws LivrariaDAOException;
	
	Livros procurarLivro(String isbn) throws LivrariaDAOException;	

}

Esse embora seja uma interface, ele me limita apenas ao objeto livros. Mas eu quero agora criar um objeto Usuario, teria eu que criar uma nova interface para esse objeto. Não há como fazer uma interface mais genérica que eu possa trabalhar com vários objetos diferentes ?

Bom dia colegas !

Acho que seria possível, mas não entendi qual a finalidade disso ?
Veja bem, não é uma critica, é que eu não entendi mesmo, se puder me explicar…

Um abraço.

nesses links tem algun exemplos de DAOs genéricos:

http://www.hibernate.org/328.html

Daí é só adaptar o código pro seu caso especial.

[quote=Zeed01]Bom dia colegas !

Acho que seria possível, mas não entendi qual a finalidade disso ?
Veja bem, não é uma critica, é que eu não entendi mesmo, se puder me explicar…

Um abraço.[/quote]

Tudo bem…Tavez eu esteja me equivocando. Essa idéia da interface peguei no " Desenvolvendo aplicações webe com jsp…tararatarara… ". Entao pensei em faze-la mais genérica para todos os típos de objetos. Para posteriormente fazer somente uma classe de implementação desses métodos.

Olha a implementação dela atual:

package model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import model.bean.Livros;
import model.util.ConnectionLivrariaFactory;

public class LivrariaDAO implements InterfaceLivrosDAO {
	
	private Connection conn;
	
	public LivrariaDAO()throws LivrariaDAOException {
		// TODO Auto-generated constructor stub
		
		try{
			
			this.conn = ConnectionLivrariaFactory.getConnection();
		}catch (Exception e) {
			// TODO: handle exception
			throw new LivrariaDAOException("Erro: "+":\n"+e.getMessage());
		}
		
	}

	public void atualizar(Livros livro) throws LivrariaDAOException {
		// TODO Auto-generated method stub
		
		Connection conn = null;
		PreparedStatement ps = null;
		
		if(livro == null){
			
			throw new LivrariaDAOException("Valor passado não pode ser nulo");
		}
		
		try {
			String sql = "update livros set titulo=?,edicao=?,publicacao=?,descricao=? where isbn = ?";
			conn = this.conn;
			ps = conn.prepareStatement(sql);
			ps.setString(1,livro.getTitulo());
			ps.setInt(2, livro.getEdicao());
			ps.setInt(3, livro.getPublicacao());
			ps.setString(4, livro.getDescricao());
			ps.setString(5,livro.getIsbn());
			ps.executeUpdate();
			
		} catch (SQLException sqle) {
			// TODO Auto-generated catch block
			throw new LivrariaDAOException("Erro ao atualizar dados"+sqle);
		}finally{
			
			ConnectionLivrariaFactory.closeConnection(conn, ps);
		}

	}

	
	public void excluir(Livros livro) throws LivrariaDAOException {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement ps = null;
		
		
		if(livro == null){
			
			throw new LivrariaDAOException("Valor passado não pode ser nulo");
			
		}
		
		try {

			
			conn = this.conn;
			ps = conn.prepareStatement("delete from livros where isbn = ?");
			ps.setString(1, livro.getIsbn());
			ps.executeUpdate();
			
		} catch (SQLException sqle) {
			// TODO Auto-generated catch block
			
			throw new LivrariaDAOException("Erro ao  excluir dados "+ sqle);
			
		}finally{
			
			ConnectionLivrariaFactory.closeConnection(conn, ps);
			
		}

	}


	public Livros procurarLivro(String isbn) throws LivrariaDAOException {
		// TODO Auto-generated method stub
		
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		if(isbn == null){
			
			throw new LivrariaDAOException("Valor passado não pode ser nulo");
		}
		
		
		try {
			String sql = "select * from livros where isbn = ?";
			conn = this.conn;
			ps = conn.prepareStatement(sql);
			ps.setString(1, isbn);
			rs = ps.executeQuery();
			
			if(!rs.next()){
				
				throw new LivrariaDAOException("Não foi encontrado nenhum registro com o ISBN: "+isbn);
				
			}
			
			Livros livro = new Livros();
			
			livro.setTitulo(rs.getString(2));
			livro.setEdicao(rs.getInt(3));
			livro.setPublicacao(rs.getInt(4));
			livro.setDescricao(rs.getString(5));
			
			return livro;
			
		} catch (SQLException sqle) {
			// TODO Auto-generated catch block
			throw new LivrariaDAOException(sqle);
		}finally{
			
			
			ConnectionLivrariaFactory.closeConnection(conn, ps, rs);
			
		}
		
	}

	
	public void salvar(Livros livro) throws LivrariaDAOException {
		// TODO Auto-generated method stub
		
		PreparedStatement ps = null;
		Connection conn = null;
		
		if(livro == null){
			
			throw new LivrariaDAOException("O valor passado não pode ser nulo");
		}
		
		try{
			String sql = "insert into livros(isbn,titulo,edicao,publicacao,descricao)" +
			"values(?,?,?,?,?)";
			
			conn = this.conn;
			ps = conn.prepareStatement(sql);
			
			ps.setString(1, livro.getIsbn());
			ps.setString(2, livro.getTitulo());
			ps.setInt(3, livro.getEdicao());
			ps.setInt(4, livro.getPublicacao());
			ps.setString(5, livro.getDescricao());
			ps.executeUpdate();
			
		}catch (Exception sqle) {
			// TODO: handle exception
			throw new LivrariaDAOException("Erro ao inserir dados: "+ sqle);
		}finally{
			
			ConnectionLivrariaFactory.closeConnection(conn,ps);
			
		}
		
	}//end method salvar()

	
	public List<Livros> todosLivros() throws LivrariaDAOException {
		// TODO Auto-generated method stub
		
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		
		try {
			String sql = "select * from livros";
			conn = this.conn;
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			
			List<Livros>list = new ArrayList<Livros>();
			
			while(rs.next()){
				
				Livros livro = new Livros();
				
				livro.setIsbn(rs.getString(1));
				livro.setTitulo(rs.getString(2));
				livro.setEdicao(rs.getInt(3));
				livro.setPublicacao(rs.getInt(4));
				livro.setDescricao(rs.getString(5));
				
				list.add(livro);
				
			}
			
			return list;
			
		} catch (SQLException sqle) {
			// TODO Auto-generated catch block
			throw new LivrariaDAOException(sqle);
		}finally{
			
			ConnectionLivrariaFactory.closeConnection(conn,ps, rs);
		}
		
		
		
	}
	/*
	public static void main(String[] args) {
		
		try {
			LivrariaDAO oj = new LivrariaDAO();
			Livros livro = new Livros();
			livro.setIsbn("0000000000003");
			oj.excluir(livro);
		} catch (LivrariaDAOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}*/

}

Está vendo se eu criar o objeto usuário, eu teria que criar uma nova classe para implementar os métodos de inclusão, atualização, etc…Deu para entender minha dúvida ou equívoco ?..rs

abraço

public interface DAO {
	
	void atualizar(Object obj)throws DAOException;
	
	void excluir(Object obj)throws DAOException;
	
	void salvar(Object obj)throws DAOException;
	
	<T> List<T>all(Class<T> objClass)throws DAOException;
	
	<T> T find(Class<T> objClass, Object key) throws DAOException;	

}
  1. Escrever “interface” na interface é redundante e viola o principio de encapsulamento (não é suposto poder diferenciar entre uma interface ou uma classe)
  2. Use genericos para criar desacoplamento.
    A implementação tem que :
  3. usar metadados e se haver sozinha com escrever SQL dinamincamente
  4. usar factories ou strategies para escrever SQL manualmente.