Đối tượng truy cập dữ liệu (DAO) trong Java


347

Tôi đã trải qua một tài liệu và tôi đã gặp một thuật ngữ được gọi là DAO. Tôi phát hiện ra rằng nó là một đối tượng truy cập dữ liệu. Ai đó có thể vui lòng giải thích cho tôi những gì thực sự là gì?

Tôi biết rằng đó là một loại giao diện để truy cập dữ liệu từ các loại nguồn khác nhau, giữa nghiên cứu nhỏ này của tôi, tôi đã va vào một khái niệm gọi là nguồn dữ liệu hoặc đối tượng nguồn dữ liệu và mọi thứ bị rối tung trong đầu tôi.

Tôi thực sự muốn biết những gì a DAOđược lập trình về mặt nó được sử dụng. Nó được sử dụng như thế nào? Bất kỳ liên kết đến các trang giải thích khái niệm này từ những thứ rất cơ bản cũng được đánh giá cao.

Câu trả lời:


447

Đối tượng truy cập dữ liệu về cơ bản là một đối tượng hoặc giao diện cung cấp quyền truy cập vào cơ sở dữ liệu cơ bản hoặc bất kỳ lưu trữ lưu trữ lâu bền nào khác.

Định nghĩa đó từ: http://en.wikipedia.org/wiki/Data_access_object

Kiểm tra sơ đồ trình tự tại đây: http://www.oracle.com/technetwork/java/dataaccessobject-138824.html

Có lẽ một ví dụ đơn giản có thể giúp bạn hiểu khái niệm:

Giả sử chúng ta có một thực thể để đại diện cho một nhân viên:

public class Employee {

    private int id;
    private String name;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

Các thực thể nhân viên sẽ được lưu vào một Employeebảng tương ứng trong cơ sở dữ liệu. Giao diện DAO đơn giản để xử lý hoạt động cơ sở dữ liệu cần thiết để thao tác một thực thể nhân viên sẽ như sau:

interface EmployeeDAO {

    List<Employee> findAll();
    List<Employee> findById();
    List<Employee> findByName();
    boolean insertEmployee(Employee employee);
    boolean updateEmployee(Employee employee);
    boolean deleteEmployee(Employee employee);

}

Tiếp theo, chúng tôi phải cung cấp một triển khai cụ thể cho giao diện đó để đối phó với máy chủ SQL và một giao diện khác để xử lý các tệp phẳng, v.v.


4
chào rami, tôi thực sự rất vui vì bạn đã cố gắng giải thích cho tôi với một exaple rất đơn giản, đó là những gì tôi cần. bạn có thể giải thích wat bạn muốn nói với 'triển khai cụ thể' không, ý bạn là chúng ta phải viết tiếp định nghĩa cho các phương thức bằng cách triển khai giao diện cho một lớp .. ??
Vasanth Nag KV

Vâng đúng vậy. Giống như một lớp có tên EmployeeSQLServerDAO thực hiện giao diện EmployeeDAO bằng cách cung cấp triển khai đầy đủ cho các phương thức của nó theo cách có liên quan đến SQL Server
Rami

4
Vì vậy, đó là tất cả một DAO là ?? nó chỉ là một lớp mà chúng tôi đang viết để truy cập cơ sở dữ liệu. Bất cứ khi nào chúng tôi cần một dịch vụ từ cơ sở dữ liệu, chúng tôi tạo một đối tượng của DAO sử dụng nó cho các hoạt động cơ sở dữ liệu và sau đó loại bỏ DAO một khi chúng tôi nhận được những gì chúng tôi muốn từ cơ sở dữ liệu. Tôi có đúng không ?? và tôi có thể biết Phạm vi của khái niệm DAO này không?
Vasanth Nag KV

5
Có, DAO như tên của nó ngụ ý là để truy cập / cập nhật bộ nhớ bên dưới liên quan đến một thực thể / lớp nhất định. Vì vậy, trong ví dụ trên, chúng ta có một lớp nhân viên / thực thể mà chúng ta sử dụng bảng DB máy chủ SQL để tồn tại. DAO nhân viên sẽ chứa các phương thức để chèn / xóa / cập nhật / chọn nhân viên
Rami

2
@PhilipRego chúng tôi chắc chắn có thể có nhiều triển khai, ví dụ như triển khai máy chủ MSSQL và một triển khai khác sử dụng tệp CSV được sử dụng với các bài kiểm tra đơn vị.
Rami

86

ĐỐI TƯỢNG TRUY CẬP DATA (DAO) là gì -

Nó là một đối tượng / giao diện , được sử dụng để truy cập dữ liệu từ cơ sở dữ liệu lưu trữ dữ liệu.

TẠI SAO CHÚNG TÔI SỬ DỤNG DAO:

nó trừu tượng hóa việc truy xuất dữ liệu từ tài nguyên dữ liệu như cơ sở dữ liệu. Khái niệm này là "tách giao diện máy khách của tài nguyên dữ liệu khỏi cơ chế truy cập dữ liệu của nó."

Vấn đề với việc truy cập dữ liệu trực tiếp là nguồn dữ liệu có thể thay đổi. Ví dụ, xem xét rằng ứng dụng của bạn được triển khai trong môi trường truy cập cơ sở dữ liệu Oracle. Sau đó, nó được triển khai đến một môi trường sử dụng Microsoft SQL Server. Nếu ứng dụng của bạn sử dụng các thủ tục được lưu trữ và mã dành riêng cho cơ sở dữ liệu (chẳng hạn như tạo một chuỗi số), làm thế nào để bạn xử lý điều đó trong ứng dụng của mình? Bạn có hai lựa chọn:

  • Viết lại ứng dụng của bạn để sử dụng SQL Server thay vì Oracle (hoặc thêm mã có điều kiện để xử lý các khác biệt) hoặc
  • Tạo một lớp nằm giữa logic ứng dụng của bạn và quyền truy cập dữ liệu


Tất cả được gọi là Mẫu DAO , Nó bao gồm:

  • Giao diện đối tượng truy cập dữ liệu - Giao diện này xác định các hoạt động tiêu chuẩn sẽ được thực hiện trên (các) đối tượng mô hình.
  • Lớp bê tông đối tượng truy cập dữ liệu - Lớp này thực hiện giao diện trên. Lớp này chịu trách nhiệm lấy dữ liệu từ nguồn dữ liệu có thể là cơ sở dữ liệu / xml hoặc bất kỳ cơ chế lưu trữ nào khác.
  • Đối tượng mô hình hoặc Đối tượng giá trị - Đối tượng này là POJO đơn giản chứa các phương thức get / set để lưu trữ dữ liệu được truy xuất bằng lớp DAO.

Vui lòng kiểm tra ví dụ này, Điều này sẽ làm rõ mọi thứ rõ ràng hơn.

Ví dụ
Tôi cho rằng những điều này phải làm rõ sự hiểu biết của bạn về DAO cho đến khi mở rộng nhất định.


13

DAO (Đối tượng truy cập dữ liệu) là một mẫu thiết kế được sử dụng rất nhiều trong các ứng dụng doanh nghiệp. Về cơ bản, đây là mô-đun được sử dụng để truy cập dữ liệu từ mọi nguồn (DBMS, XML, v.v.). Tôi đề nghị bạn đọc một số ví dụ, như thế này:

Ví dụ DAO

Xin lưu ý rằng có nhiều cách khác nhau để triển khai Mẫu DAO ban đầu và có nhiều khung có thể đơn giản hóa công việc của bạn. Ví dụ, các khung ORM (Ánh xạ quan hệ đối tượng) như iBatis hoặc Hibernate, được sử dụng để ánh xạ kết quả của các truy vấn SQL tới các đối tượng java.

Hy vọng nó sẽ giúp, Tạm biệt!


8

Mẫu đối tượng truy cập dữ liệu hoặc mẫu DAO được sử dụng để phân tách API truy cập dữ liệu cấp thấp hoặc hoạt động khỏi các dịch vụ kinh doanh cấp cao. Sau đây là những người tham gia Mô hình đối tượng truy cập dữ liệu.

Giao diện đối tượng truy cập dữ liệu - Giao diện này xác định các hoạt động tiêu chuẩn sẽ được thực hiện trên (các) đối tượng mô hình.

Lớp bê tông đối tượng truy cập dữ liệu - Lớp này thực hiện giao diện trên. Lớp này chịu trách nhiệm lấy dữ liệu từ nguồn dữ liệu có thể là cơ sở dữ liệu / xml hoặc bất kỳ cơ chế lưu trữ nào khác.

Đối tượng mô hình hoặc Đối tượng giá trị - Đối tượng này là POJO đơn giản chứa các phương thức get / set để lưu trữ dữ liệu được truy xuất bằng lớp DAO.

Mã mẫu ở đây ..


7

Tôi sẽ nói chung và không cụ thể đối với Java vì DAO và ORM được sử dụng trong tất cả các ngôn ngữ.

Để hiểu DAO trước tiên bạn cần hiểu ORM (Object Rational Mapping). Điều này có nghĩa là nếu bạn có một bảng được gọi là "người" với các cột "tên" và "tuổi", thì bạn sẽ tạo mẫu đối tượng cho bảng đó:

type Person {
name
age
}

Bây giờ với sự trợ giúp của DAO thay vì viết một số truy vấn cụ thể, để tìm nạp tất cả mọi người, cho loại db bạn đang sử dụng (có thể dễ bị lỗi) thay vì bạn thực hiện:

list persons = DAO.getPersons();
...
person = DAO.getPersonWithName("John");
age = person.age;

Bạn không tự viết bản tóm tắt DAO, thay vào đó, nó thường là một phần của một số dự án mã nguồn mở, tùy thuộc vào ngôn ngữ và khuôn khổ bạn đang sử dụng.

Bây giờ đến câu hỏi chính ở đây. " .. mọi nơi nó được sử dụng .. ". Thông thường nếu bạn đang viết mã kinh doanh và tên miền cụ thể phức tạp, cuộc sống của bạn sẽ rất khó khăn nếu không có DAO. Tất nhiên, bạn không cần phải sử dụng ORM và DAO được cung cấp, thay vào đó bạn có thể viết trừu tượng và truy vấn riêng của mình. Tôi đã làm điều đó trong quá khứ và hầu như luôn hối hận về sau.


6

Tôi nghĩ rằng ví dụ tốt nhất (cùng với lời giải thích) bạn có thể tìm thấy trên trang web của nhà tiên tri: ở đây . Một gia sư tốt có thể được tìm thấy ở đây .


2
Có phải chỉ tôi hoặc hầu hết các hướng dẫn và trang web thông tin Java đã quá cũ? Hướng dẫn đó là từ năm 2008! Rất nhiều kết quả tìm kiếm hàng đầu về các chủ đề Java khác nhau thậm chí còn cũ hơn.
bergie3000

2
@ bergie3000: mẫu này không mới.
Bằng Rikimaru

5

Đừng nhầm lẫn với quá nhiều lời giải thích. DAO: Từ chính tên, nó có nghĩa là Truy cập dữ liệu bằng Object. DAO được tách ra khỏi Logic kinh doanh khác.


4

Đối tượng truy cập dữ liệu quản lý kết nối với nguồn dữ liệu để lấy và lưu trữ dữ liệu. Nó trừu tượng hóa việc triển khai truy cập dữ liệu cơ bản cho Đối tượng kinh doanh để cho phép truy cập minh bạch vào nguồn dữ liệu. Nguồn dữ liệu có thể là bất kỳ cơ sở dữ liệu nào như RDBMS, kho lưu trữ XML hoặc hệ thống tệp phẳng, v.v.


4

Mùa xuân JPA DAO

Ví dụ, chúng tôi có một số nhóm thực thể.

Đối với thực thể này, chúng tôi tạo kho lưu trữ GroupRep repository.

public interface GroupRepository extends JpaRepository<Group, Long> {   
}

Sau đó, chúng ta cần tạo một lớp dịch vụ mà chúng ta sẽ sử dụng kho lưu trữ này.

public interface Service<T, ID> {

    T save(T entity);

    void deleteById(ID id);

    List<T> findAll();

    T getOne(ID id);

    T editEntity(T entity);

    Optional<T> findById(ID id);
}

public abstract class AbstractService<T, ID, R extends JpaRepository<T, ID>> implements Service<T, ID> {

    private final R repository;

    protected AbstractService(R repository) {
        this.repository = repository;
    }

    @Override
    public T save(T entity) {
        return repository.save(entity);
    }

    @Override
    public void deleteById(ID id) {
        repository.deleteById(id);
    }

    @Override
    public List<T> findAll() {
        return repository.findAll();
    }

    @Override
    public T getOne(ID id) {
        return repository.getOne(id);
    }

    @Override
    public Optional<T> findById(ID id) {
        return repository.findById(id);
    }

    @Override
    public T editEntity(T entity) {
        return repository.saveAndFlush(entity);
    }
}

@org.springframework.stereotype.Service
public class GroupServiceImpl extends AbstractService<Group, Long, GroupRepository> {

    private final GroupRepository groupRepository;

    @Autowired
    protected GroupServiceImpl(GroupRepository repository) {
        super(repository);
        this.groupRepository = repository;
    }
}

Và trong bộ điều khiển chúng tôi sử dụng dịch vụ này.

@RestController
@RequestMapping("/api")
class GroupController {

    private final Logger log = LoggerFactory.getLogger(GroupController.class);

    private final GroupServiceImpl groupService;

    @Autowired
    public GroupController(GroupServiceImpl groupService) {
        this.groupService = groupService;
    }

    @GetMapping("/groups")
    Collection<Group> groups() {
        return groupService.findAll();
    }

    @GetMapping("/group/{id}")
    ResponseEntity<?> getGroup(@PathVariable Long id) {
        Optional<Group> group = groupService.findById(id);
        return group.map(response -> ResponseEntity.ok().body(response))
                .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

    @PostMapping("/group")
    ResponseEntity<Group> createGroup(@Valid @RequestBody Group group) throws URISyntaxException {
        log.info("Request to create group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.created(new URI("/api/group/" + result.getId()))
                .body(result);
    }

    @PutMapping("/group")
    ResponseEntity<Group> updateGroup(@Valid @RequestBody Group group) {
        log.info("Request to update group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.ok().body(result);
    }

    @DeleteMapping("/group/{id}")
    public ResponseEntity<?> deleteGroup(@PathVariable Long id) {
        log.info("Request to delete group: {}", id);
        groupService.deleteById(id);
        return ResponseEntity.ok().build();
    }    
}

Điều này dường như đang giải thích mẫu Kho lưu trữ chứ không phải mẫu DAO theo yêu cầu của tác giả ban đầu. Ngoài ra, tôi tin rằng ví dụ của bạn có thể gây hiểu lầm vì giao diện của bạn phải tuân theo cách tiếp cận như Bộ sưu tập, vì vậy một số thao tác của bạn không phù hợp.
Jan Haesen

2

DAO là một hành động như "Trình quản lý bền bỉ" trong kiến ​​trúc 3 tầng cũng như DAO cũng thiết kế mẫu khi bạn có thể tham khảo cuốn sách "Gang of Four". Lớp dịch vụ ứng dụng của bạn chỉ cần gọi phương thức của lớp DAO mà không cần biết chi tiết ẩn & nội bộ của phương thức DAO.


2

Các cụm Dao được sử dụng để sử dụng lại logic jdbc & Dao (Đối tượng truy cập dữ liệu) là một mẫu thiết kế. dao là một lớp java đơn giản chứa logic JDBC.

Lớp truy cập dữ liệu đã được chứng minh là tốt trong lớp logic nghiệp vụ riêng biệt và lớp liên tục. Mẫu thiết kế DAO che giấu hoàn toàn việc thực hiện truy cập dữ liệu từ các máy khách của nó

Đối tượng truy cập dữ liệu Java (Java DAO) là một thành phần quan trọng trong các ứng dụng kinh doanh. Các ứng dụng kinh doanh hầu như luôn cần truy cập vào dữ liệu từ cơ sở dữ liệu quan hệ hoặc đối tượng và nền tảng Java cung cấp nhiều kỹ thuật để truy cập dữ liệu này. Kỹ thuật lâu đời nhất và trưởng thành nhất là sử dụng API kết nối cơ sở dữ liệu Java (JDBC), cung cấp khả năng thực thi các truy vấn SQL dựa trên cơ sở dữ liệu sau đó tìm nạp các kết quả, mỗi lần một cột.


1

Pojo cũng coi là lớp Model trong Java nơi chúng ta có thể tạo getter và setter cho biến cụ thể được xác định ở chế độ riêng tư. Hãy nhớ tất cả các biến được khai báo ở đây với công cụ sửa đổi riêng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.