创建一个默认的 DAO 接口

Creating a default DAO interface

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

public interface DAO {

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

现在我们可以通过多个class实现这个接口。当然,这种解决方案有它的缺点,比如在检索数据期间向下转换,但我认为它仍然更高效且代码清晰。这是个好方法吗?

这是一个好方法,但至少可以使用泛型进行改进:

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[],因为在泛型的情况下不能这样做。但这不是缺点,还是使用内置容器更好。

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

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);
   }
}

我不会做的。如果你有一个你只从中读取的 table 怎么办(也许其他 module/program/etc 更新它?或者如果它只是你想手动设置一次然后忘记的一些设置?)。或者,如果您希望能够从同一个 table 中获取多个项目怎么办(也许您只需要一些东西的 ID 而其他东西的完整对象)?虽然它可能更容易编写,但我认为接口 DAO 更难使用。

我也真的不认为可读性更好。 CarDAO.getItem(123) 告诉你的比 CarDAO.getCarById(123) 少很多。如果你想通过其他方式获得汽车,你不必重载它(是的,你可以只做一些不在界面中的东西,但界面的好处更小)。