如何devise一个DAO类?

devise一个DAO类最好的方法是什么?

方法1: deviseDAO类作为对象

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

方法2: 用静态方法deviseDAO类 (又名静态类)

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

在方法#1中,我必须在所有的客户端代码中创build一个DAO类的对象(其他选项是全部传递DAO的引用)。 而在方法#2中,我不必创build对象,并且可以devise静态方法而不进行状态跟踪。

那么哪种方法在DAO类的devise中是最好的呢?

我会推荐方法#1,但会使用Spring进行dependency injection,而不是直接实例化DAO。

这样,为了对客户端代码进行unit testing,你可以用模拟DAO替代,并且用适当的参数validation正确的DAO是否被调用。 (Mockito在这里很有用。)

如果你使用静态方法,那么unit testing要困难得多,因为静态方法不能被覆盖。

要有更多的抽象:

 interface IDAO<T> { public save(T t); public T getById(int id); //...etc } 

然后

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

和DAO的另一个领域

 public UniversityDao implements IDAO<University>{ public save(University u){ //Code here } public University getById(int id){ //Code here } } 

现在表示层或主类将包含这样的代码:

 IDAO dao; dao=new CustomerDao(); //... dao=new UniversityDao(); 

我会去select1,但我也build议你编程接口。 创build一个接口来设置DAO必须提供哪些function,然后根据您的需要可以实现不同类的接口。

 public interface CustomerDao { public void saveCustomer(Customer customer); public Customer getCustomer(int id); } 

然后你可以让class SimpleCustomerDao implements CustomerDAO {/*code here*/}

在你的main (和其他地方,你需要它),你会有:

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

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

是的,如果你使用Spring或Guice,那么请使用dependency injection!

参考文章如何编写一个通用的DAO(使用Spring AOP): 不要重复DAO!

你可以find你的技术堆栈的通用DAO实现的例子(只是谷歌“不要重复DAO my_technology”)。

我会喜欢分层的方法,这个方法只是告诉我们:

  1. 你有你的模型类客户
  2. 您正通过Interface CustomerDAO与客户签订合同

     public interface CustomerDAO{ public void saveCustomer(Customer customer); public Customer getCustomer(int id); } 
  3. 你有一个像CustomerDAOImpl的具体实现

     public class CustomerDAOImpl extends CustomerDAO{ public void saveCustomer(Customer customer){ saveCustomer(customer); } public Customer getCustomer(int id){ return fetchCustomer(id); } } 

然后写一个pipe理器来pipe理这些或封装一些其他DAO,如:

 public class ManagerImpl extends Manager{ CustomerDAO customerDAOObj; // maybe you need to collect // all the customer related activities here in manger // because Client must not bother about those things. UserBillingDAO userBillingDAOObj; public void saveCustomer(Customer customer){ customerDAOObj.saveCustomer(customer); } public Customer getCustomer(int id){ return customerDAOObj.fetchCustomer(id); } // Note this extra method which is defined in //UserBillingDAO which I have not shown, but you are exposing //this method to your Client or the Presentation layer. public boolean doBillingOFCustomer(id) { return userBillingDAOObj.doBilling(id); } } 

现在表示层或主类将包含这样的代码:

 public static void main(String... ar){ Manager manager = new ManagerImpl(); manager.saveCustomer(); // or manager.doBillingOfCustomer(); // etc }