2013-03-21 24 views
6

Tôi mới sử dụng Java và tôi đang cố tạo một dự án web với các servlet. Tôi muốn truy vấn cơ sở dữ liệu của mình nhưng tôi nghĩ tôi không hiểu mọi thứ về JPA và DAO.Mới đối với Java - JPA và DAO là gì?

Tôi đã được dạy để làm những việc theo cách này:

  • Tạo lớp com.package.entity.User (được tạo ra từ cơ sở dữ liệu của tôi)
  • Tạo giao diện com.package.dao.UserDao
  • Tạo lớp com.package.dao.jpa.JpaUserDao thực hiện UserDao
  • Tạo EJB com.package.service.UserService với các phương pháp như public List<User> findAll()

Tôi nghe nói rằng không cần phải tạo một giao diện DAO với JPA nhưng tôi hoàn toàn bị mất và tôi không hiểu tất cả những gì tôi nên làm hoặc EJB là gì. Tôi chỉ muốn tìm tất cả người dùng trong cơ sở dữ liệu của tôi và hiển thị tên của họ theo các thực hành tốt của Java.

Đó là allready OK cho servlets và JSP của tôi.

Bạn sẽ đề xuất điều gì?

+1

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

+0

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

Trả lời

7

DAO là viết tắt của "Đối tượng truy cập dữ liệu". Nó tóm tắt khái niệm "lấy thứ gì đó từ kho dữ liệu". Các đối tượng DAO của bạn có thể được thực hiện với các cuộc gọi JDBC, các cuộc gọi JPA hoặc bất kỳ thứ gì. Có thể nó gọi một số dịch vụ web từ xa. Có một DAO trên JPA có vẻ dư thừa và nó thêm một lớp, nhưng tôi nghĩ rằng nó là giá trị nó.

Ví dụ: bạn có thể có trường hợp sử dụng "người dùng hiển thị có mắt xanh".

với JPA thẳng:

List<User> users = entityManager.createQuery("select u from User u where u.EyeColor = 'green'""); 

với một DAO bạn phải:

List<User> users = dao.UsersWithEyeColor("green"); 

Các DAO đây có một vài ưu điểm:

  1. Nó là dễ dàng hơn để đọc .
  2. Nó không tiết lộ cấu trúc cơ sở dữ liệu của bạn với phần còn lại của ứng dụng
  3. Sẽ dễ dàng hơn nhiều cho việc kiểm tra đơn vị. Lớp học khiến người dùng có đôi mắt xanh chỉ cần tạo dao "Mock". Điều này dễ hơn JPA chế nhạo.

Đây chỉ là một vài đối số để sử dụng DAO. Đối với một ứng dụng nhỏ, rất đơn giản, nó có thể là quá nhiều chi phí. Nhưng đối với bất cứ điều gì sẽ trở nên lớn hơn và cần phải được duy trì trong nhiều năm, tôi nghĩ rằng nó là giá trị nó.

+1

Truy vấn của bạn sẽ trả về người dùng có mắt xanh, không phải là mắt xanh, như bạn dự định ban đầu. :) – artaxerxe

+0

Cảm ơn artaxerxe – Dave

6

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

+0

Điều đó dường như được thiết kế hoàn toàn cho trường hợp sử dụng thông thường, nơi bạn có thể lấy dữ liệu của bạn thông qua JDBC * hoặc * qua JPA2, nhưng bạn không thay đổi phương thức truy cập nilly-willy. Quên các nhà máy, chỉ cần khởi tạo DAO của bạn. –

+0

@Marcelo, tôi có thể biết tại sao JDBC vẫn cần thiết khi JPA đang được sử dụng? Hiện nay, tôi cũng đang làm một cái gì đó như thế nhưng tôi khá bối rối cho dù tôi nên trộn JDBC với JPA. Mong tin bạn. Tks. –

+1

Xin chào @KarenGoh. Nếu bạn đã quyết định sử dụng một khung công tác bền vững như vậy, thì tôi không thấy lý do tại sao bạn nên trộn JDBC với nó. Trong ví dụ cụ thể này, tôi chỉ cố gắng cho thấy làm thế nào bạn có thể xử lý các loại khác nhau của "quản lý" kiên trì dựa trên một ứng dụng tôi đã làm việc trong công việc trước đây của tôi. Nó bắt đầu với mô hình này (DAO) bằng JDBC vào năm 2004, sau đó chuyển sang Pure Hibernate vào năm 2009 và sau đó tôi di chuyển sang JPA (+ Eclipselink) vào năm 2013. Ví dụ này được thực hiện chỉ để cho thấy cách chúng ta có thể thay đổi chế độ persistence từ kiểu này sang kiểu khác theo cách dễ dàng với mẫu này. –

Các vấn đề liên quan