DAO (Đối tượng truy cập dữ liệu) về cơ bản là một mẫu để lập trình, để sử dụng, bạn phải tạo một lớp sẽ tạo đối tượng cung cấp giao diện trừu tượng cho một số loại đơn vị kiên trì (db, hệ thống tệp. Xml, v.v.) Tại sao lại hữu ích? Bởi vì nó cung cấp một số hoạt động dữ liệu cụ thể mà không cần tiết lộ chi tiết của cơ sở dữ liệu.
Một ví dụ cơ bản của DAO:
import java.util.List;
public abstract class DAOFactory {
public static final int MYSQL_JDBC = 1;
public static final int MYSQL_JPA = 2;
public static final int MYSQL_HIBERNATE = 3;
public abstract List<UserDTO> listAllUsers();
public static DAOFactory getDAOFactory(int whichFactory) {
switch (whichFactory) {
case MYSQL_JDBC : return new MySqlJDBCDaoFactory();
case MYSQL_JPA: return new MySqlJpaDaoFactory();
case MYSQL_HIBERNATE: return new MySqlHibernateDaoFactory();
default: return null;
}
}
}
Sau đó, bạn phải tạo một nhà máy cụ thể đối với từng loại kiên trì bạn sẽ quản lý trong ứng dụng của bạn, và rằng nhà máy cụ thể phải thực hiện các phương pháp bạn sử dụng cho sự kiên trì, ví dụ listAllUsers();
Ví dụ, đối với MySQL JPA:
public class MySqlJpaDaoFactory extends DAOFactory {
@Override
public List<UserDTO> listAllUsers() {
// Here I implement specific functionality to retrieve data using JPA Framework
//EntityManagerFactory emf = ...
//EntityManager em = ...
//List<UserDTO> list = em.get...();
//return list;
return null;
}
}
Đối với MySQL JDBC bạn phải làm quá trình khác:
public class MySqlJDBCDaoFactory extends DAOFactory {
@Override
public List<UserDTO> listAllUsers() {
//Connection = DriverManager ...
//PreparedStatement ps = connection.prepareStatement("select * from ...");
//ResultSet = ps.executeQuery()
// and so on...
return null;
}
}
Sau đó bạn gọi nhà máy của bạn theo cách này:
DAOFactory myfactory = DAOFactory.getDAOFactory(DAOFactory.MYSQL_JDBC);
List<UserDTO> list = myfactory.listAllUsers();
Và nếu bạn có thể thấy không có vấn đề gì nếu bạn thay đổi khung cơ sở dữ liệu hoặc chế độ kiên trì, bạn không phải phát minh lại bánh xe, chỉ cần thay đổi một tham số và bạn sẽ nhận được việc thực hiện cho sự kiên trì mà bạn muốn, chỉ dựa vào một tham số.
Hy vọng nó có thể giúp bạn hiểu mô hình, tôi không sử dụng EJB, và nếu bạn đang sử dụng DAO tôi không nghĩ rằng nó vẫn còn cần thiết để thực hiện EJB.
Trân trọng
Xem câu hỏi này tương tự: http://programmers.stackexchange.com/questions/97423/are-there-any-real-benifits-to-a-dao-layer – Dave
Vấn đề là: đây là tiếng Trung cho tôi! Tôi thậm chí không biết những gì DAO làm, bởi vì tôi chỉ tạo ra các giao diện DAO. Nó là một lớp trừu tượng như PDO cho PHP? Hoặc giống như một ORM như Doctrine? – mimipc