创建默认DAO界面

时间:2015-08-06 11:40:54

标签: java dao

我想知道创建默认DAO界面而不是为每个类创建自己的界面是否是一个好习惯。

public interface DAO {

    public void addItem();
    public void updateItem();
    public void removeItem();
    public Object getItem(int id);
    public Object[] getAll();
}

现在我们可以通过多个类实现此接口。当然,这种解决方案在检索数据时有点像向下转换,但我认为它更有效,代码更清晰。这是一个好方法吗?

3 个答案:

答案 0 :(得分:6)

这是一种好方法,但使用泛型可以完成至少一项改进:

public interface DAO<T> {
    public void addItem(T item);
    public void updateItem(T item);
    public void removeItem(T item);
    public T getItem(int id);
    public List<T> getAll();
}

所以现在你不需要任何演员。但无论如何,你必须确保所有的DAO至少都有这些方法。否则会导致更复杂的问题。此外,如果有一些DAO只具有这些方法,那么最终会得到非常紧凑的干净代码,例如:

public interface UserDAO extends DAO<User> {
    // And that is basically it :)
}

public class UserDAOImpl implements UserDAO {
    // Your implementations here
    // ...
}

注意:我已将Object[]替换为List<T>而非T[],因为在泛型的情况下您无法做到这一点。但这不是缺点,最好使用内置容器。

答案 1 :(得分:2)

没有。遵循以下结构将是干净的。

interface DAO {
   void insert();
   void update();
   Object read(Integer id);
   void delete();
}

class DAOImpl implements DAO {
   void insert(){}
   void update(){}
   Object read(Integer id){}
   void delete(){}
}

class ItemDAO extends DAOImpl{
   public void addItem(Item i){
     insert(i);
   }
   public void updateItem(Item i){
     update(i);
   }
   public void removeItem(Item i){
     delete(i);
   }
   public Object getItem(int id){
     read(id);
   }
}

答案 2 :(得分:1)

我不会这样做。如果您有一个只能读取的表(或者某些其他模块/程序/等更新它?或者它只是一些您希望手动设置然后忘记的设置?),该怎么办?或者,如果您希望能够从同一个表中获取多个项目(或许您只需要某些东西的ID,而其他东西需要完整的对象),该怎么办?虽然编写起来可能比较容易,但我认为接口的DAO更难以使用。

我也不认为可读性更好。 CarDAO.getItem(123)告诉你比CarDAO.getCarById(123)少得多。如果你想通过别的东西获得汽车,那么你不必超载它(是的,你可以在界面上做一些不是那样的东西,但接口的好处甚至更小)。