如何设计DAO类?

nib*_*012 39 java

什么应该是设计DAO类的最佳方法?

方法#1:将 DAO类设计为对象.

class Customer {
//customer class
}

class CustomerDAO {
  public void saveCustomer(Customer customer) {
  //code
  }

  public Customer getCustomer(int id) {
  //code
  }
}

//Client code
class client {
  public static void main(String[] args) {

   CustomerDAO customerDAO = new CustomerDAO();
   Customer customer = new Customer();
   customerDAO.saveCustomer(customer);
  }
}
Run Code Online (Sandbox Code Playgroud)

方法#2: 使用静态方法设计DAO类(又名静态类)

class Customer {
//customer class
}

class CustomerDAO {
  public static void saveCustomer(Customer customer) {
  //code
  }

  public static Customer getCustomer(int id) {
  //code
  }
}

//Client code
class client {
  public static void main(String[] args) {

   Customer customer = new Customer();
   CustomerDAO.saveCustomer(customer);
  }
}
Run Code Online (Sandbox Code Playgroud)

方法#1中,我必须在所有客户端代码中创建DAO类的对象(其他选项是传递DAO的引用).在方法#2中,我不必创建对象,静态方法可以设计为没有状态跟踪.

那么哪种方法最适合DAO类的设计呢?

Eri*_*son 37

我建议方法#1,但是会使用Spring进行依赖注入而不是直接实例化DAO.

这样,对于单元测试客户端代码,您可以替换模拟DAO,并验证是否使用适当的参数调用了正确的DAO.(Mockito在这里很有用.)

如果使用静态方法,则单元测试要困难得多,因为静态方法无法被覆盖.

  • +1我自己懒得写这个答案.但它与这一个完全相同:-) (5认同)

Abd*_*UMI 11

要有更多的抽象:

interface IDAO<T> {

  public save(T t);
  public T getById(int id);
  //...etc

}
Run Code Online (Sandbox Code Playgroud)

然后

public CustomerDao implements IDAO<Customer>{
   public save(Customer c){
        //Code here
    }
   public Customer getById(int id){
      //Code here
    }
}
Run Code Online (Sandbox Code Playgroud)

和DAO到另一个域

public UniversityDao implements IDAO<University>{

     public save(University u){
       //Code here
      }
     public University getById(int id){
        //Code here
     }
}
Run Code Online (Sandbox Code Playgroud)

现在表示层或主类将包含如下代码:

IDAO  dao;
dao=new CustomerDao();
//...
dao=new UniversityDao();
Run Code Online (Sandbox Code Playgroud)


Mar*_*ace 6

我也会选择选项1,但我也建议你编程接口.创建一个界面,设置DAO必须提供的功能,然后根据需要实现具有不同类的功能.

public interface CustomerDao {
    public void saveCustomer(Customer customer);

    public Customer getCustomer(int id);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以拥有class SimpleCustomerDao implements CustomerDAO {/*code here*/}.

在你main(以及你需要的任何其他地方)你将拥有:

//Note that you have an interface variable and a real class object 
CustomerDao customerDao = new SimpleCustomerDao();
Run Code Online (Sandbox Code Playgroud)

你可以弄清楚这样做的好处!

是的,如果您使用SpringGuice,那么请使用依赖注入!


And*_*rey 5

请参阅文章如何编写通用DAO(使用Spring AOP): 不要重复DAO!

您可以找到技术堆栈的通用DAO实现示例(只是谷歌"不要重复DAO my_technology").