如何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”)。
我会喜欢分层的方法,这个方法只是告诉我们:
- 你有你的模型类客户
-
您正通过Interface CustomerDAO与客户签订合同
public interface CustomerDAO{ public void saveCustomer(Customer customer); public Customer getCustomer(int id); }
-
你有一个像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 }