Lớp DAO "có thể cắm được" thường / luôn dựa trên giao diện DAO. Ví dụ:chúng ta hãy xem xét một cái khá chung chung đơn giản:
public interface GenericDAO <T, K extends Serializable> {
List<T> getAll(Class<T> typeClass);
T findByKey(Class<T> typeClass, K id);
void update(T object);
void remove(T object);
void insert(T object);
}
(Đây là những gì bạn có trong DAO chung củaMorphia )
Sau đó, bạn có thể phát triển một số triển khai DAO chung chung khác nhau, nơi bạn có thể tìm thấy các trường khác nhau (được phản ánh trong các tham số của hàm tạo, bộ cài đặt và bộ nhận, v.v.). Hãy giả sử một cái dựa trên JDBC:
public class GenericDAOJDBCImpl<T, K extends Serializable> implements GenericDAO<T, K extends Serializable> {
private String db_url;
private Connection;
private PreparedStatement insert;
// etc.
}
Sau khi DAO chung được triển khai (cho một kho dữ liệu cụ thể), việc nhận được một DAO cụ thể sẽ không còn là điều gì phải bàn cãi:
public interface PersonDAO extends GenericDAO<Person, Long> {
}
và
public class PersonDAOJDBCImpl extends GenericDAOJDBCImpl<Person, Long> implements PersonDAO {
}
(BTW, những gì bạn có trong Morphia's BasicDAO là một triển khai của DAO chung cho MongoDB).
Điều thứ hai trong kiến trúc có thể cắm được là việc lựa chọn triển khai DAO cụ thể. Tôi khuyên bạn nên đọc chương 2 từ Apress:Pro Spring 2.5 ("Đưa Spring vào" Hello World ") để dần dần tìm hiểu về các nhà máy và sự phụ thuộc.