390

我在浏览一个文档时遇到了一个名为DAO. 我发现它是一个数据访问对象。有人可以解释一下这实际上是什么吗?

我知道它是一种用于访问来自不同类型源的数据的接口,在我的这个小研究中,我碰到了一个叫做数据源或数据源对象的概念,我脑子里一团糟。

我真的很想知道 aDAO在哪里使用它以编程方式是什么。它是如何使用的?任何指向从非常基本的东西解释这个概念的页面的链接也受到赞赏。

4

13 回答 13

505

数据访问对象基本上是提供对底层数据库或任何其他持久性存储的访问的对象或接口。

该定义来自: http ://en.wikipedia.org/wiki/Data_access_object

还要检查这里的序列图: http ://www.oracle.com/technetwork/java/dataaccessobject-138824.html

也许一个简单的例子可以帮助你理解这个概念:

假设我们有一个代表员工的实体:

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;
    }

}

员工实体将被持久化到Employee数据库中的相应表中。一个简单的 DAO 接口来处理操作员工实体所需的数据库操作,如下所示:

interface EmployeeDAO {

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

}

接下来,我们必须为该接口提供一个具体的实现来处理 SQL 服务器,另一个来处理平面文件等。

于 2013-10-03T08:36:12.043 回答
98

什么是数据访问对象 (DAO) -

它是一个对象/接口,用于从数据存储的数据库中访问数据

为什么我们使用 DAO:

从数据库等数据资源中抽象出数据检索。
这个概念是“将数据资源的客户端接口与其数据访问机制分开”。
 

直接访问数据的问题是数据的来源可能会改变。例如,假设您的应用程序部署在访问 Oracle 数据库的环境中。随后将其部署到使用 Microsoft SQL Server 的环境中。如果您的应用程序使用存储过程和特定于数据库的代码(例如生成数字序列),您如何在应用程序中处理这些?你有两个选择:

  • 重写您的应用程序以使用 SQL Server 而不是 Oracle(或添加条件代码来处理差异),或者
  • 在应用程序逻辑和数据访问层之间创建一个层

DAO 模式由以下部分组成:

  • 数据访问对象接口- 此接口定义要在模型对象上执行的标准操作。
  • 数据访问对象具体类- 该类实现上述接口。此类负责从数据源获取数据,该数据源 可以是数据库/xml 或任何其他存储机制。
  • 模型对象或值对象- 此对象是简单的 POJO,包含 get/set 方法来存储使用 DAO 类检索的数据。

查看示例

我希望这已经澄清了你对 DAO 的理解!

于 2015-07-31T08:20:52.513 回答
15

DAO(数据访问对象)是企业应用程序中非常常用的设计模式。它基本上是用于访问来自每个源(DBMS、XML 等)的数据的模块。我建议您阅读一些示例,例如:

DAO 示例

请注意,实现原始DAO 模式有不同的方法,并且有许多框架可以简化您的工作。例如,像 iBatis 或 Hibernate 这样的 ORM(对象关系映射)框架用于将 SQL 查询的结果映射到 java 对象。

希望对你有帮助,再见!

于 2013-10-03T08:36:52.480 回答
9

数据访问对象模式或 DAO 模式用于将低级数据访问 API 或操作与高级业务服务分开。以下是数据访问对象模式的参与者。

数据访问对象接口 - 此接口定义要在模型对象上执行的标准操作。

数据访问对象具体类 - 该类实现上述接口。此类负责从数据源获取数据,该数据源可以是数据库/xml 或任何其他存储机制。

模型对象或值对象 - 此对象是简单的 POJO,包含 get/set 方法来存储使用 DAO 类检索的数据。

示例代码在这里..

于 2014-06-15T06:22:00.253 回答
8

因为 DAO 和 ORM 用于所有语言,所以我将笼统地介绍 Java,而不是特定于 Java。

要了解 DAO,首先需要了解 ORM(对象关系映射)。这意味着如果您有一个名为“person”的表,其中包含“name”和“age”列,那么您将为该表创建对象模板:

type Person {
name
age
}

现在借助 DAO 而不是编写一些特定的查询来获取所有人,对于您使用的任何类型的数据库(这可能容易出错),您可以这样做:

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

您不必自己编写 DAO 抽象,而是它通常是某个开源项目的一部分,具体取决于您使用的语言和框架。

现在到这里的主要问题。“ ..它在哪里使用.. ”。通常,如果您正在编写复杂的业务和特定领域的代码,那么如果没有 DAO,您的生活将非常困难。当然你不需要使用提供的 ORM 和 DAO,而是你可以编写自己的抽象和原生查询。我过去曾这样做过,后来几乎总是后悔。

于 2018-05-25T12:30:03.483 回答
6

我认为您可以在 oracle 网站上找到最好的示例(以及解释):here。另一个很好的教程可以在这里找到。

于 2013-10-03T08:41:42.917 回答
6

不要被太多的解释弄糊涂了。DAO:从名字本身来看,它的意思是使用对象访问数据。DAO 与其他业务逻辑分离。

于 2016-07-27T17:40:10.333 回答
5

Spring JPA DAO

例如我们有一些实体组。

对于这个实体,我们创建存储库 GroupRepository。

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

然后我们需要创建一个服务层,我们将使用这个存储库。

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;
    }
}

在控制器中我们使用这个服务。

@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();
    }    
}
于 2019-02-13T14:58:10.170 回答
4

数据访问对象管理与数据源的连接以获取和存储数据。它为业务对象抽象了底层数据访问实现,以实现对数据源的透明访问。数据源可以是任何数据库,例如 RDBMS、XML 存储库或平面文件系统等。

于 2014-06-18T06:54:06.807 回答
2

DAO 是一个类似于 3 层架构中的“持久性管理器”的行为,也是 DAO 的设计模式,您可以参考“Gang of Four”一书。您的应用程序服务层只需要调用 DAO 类的方法,而不需要知道 DAO 方法的隐藏和内部细节。

于 2016-04-27T06:57:03.870 回答
2

Dao clases 用于重用 jdbc 逻辑 & Dao(Data Access Object) 是一种设计模式。dao 是一个包含 JDBC 逻辑的简单 java 类。

数据访问层在单独的业务逻辑层和持久层中被证明是好的。DAO 设计模式对其客户端完全隐藏了数据访问实现

Java 数据访问对象 (Java DAO) 是业务应用程序中的重要组件。业务应用程序几乎总是需要访问关系数据库或对象数据库中的数据,而 Java 平台提供了许多访问这些数据的技术。最古老和最成熟的技术是使用 Java 数据库连接 (JDBC) API,它提供了对数据库执行 SQL 查询然后一次获取一列结果的能力。

于 2016-07-13T06:35:36.963 回答
1

Pojo 还考虑作为 Java 中的 Model 类,我们可以在其中为 private 中定义的特定变量创建 getter 和 setter。记住所有变量都在这里用 private 修饰符声明

于 2016-07-13T06:21:50.753 回答
1

我只是想用我在一个项目中经历的一个小故事,以我自己的方式来解释它。首先我想解释一下为什么 DAO 很重要?而不是去什么是DAO?为了更好地理解。

为什么 DAO 很重要?
在我的一个项目中,我使用Client.class了其中包含我们系统用户的所有基本信息。在我需要客户端的地方,然后每次我需要在需要的地方进行丑陋的查询。然后我觉得降低了可读性并做了很多冗余的样板代码

然后我的一位高级开发人员介绍了一个QueryUtils.class使用public static访问修饰符添加所有查询的地方,然后我不需要在任何地方进行查询。假设当我需要激活的客户端时,我只需调用 -

QueryUtils.findAllActivatedClients();

通过这种方式,我对我的代码进行了一些优化。

但是还有一个问题!!!

我觉得 QueryUtils.class 增长得非常快。该类中包含 100 多个方法,阅读和使用也非常麻烦。因为这个类包含另一个域模型的其他查询(例如产品、类别位置等)

然后超级英雄CTO 先生介绍了一个名为DAO的新解决方案,最终解决了这个问题。我觉得 DAO 是非常特定于领域的。例如,他创建了一个名为 DAO 的ClientDAO.class所有Client.class相关查询都可以在其中找到,这对我来说似乎很容易使用和维护。这个巨人QueryUtils.class被分解成许多其他特定领域的 DAO,例如ProductsDAO.classCategoriesDAO.class等等,这使得代码更易读、更易维护、更解耦

什么是 DAO?

它是一个对象或接口,它提供了一种从数据库访问数据的简单方法,而无需每次都以可重用的方式编写复杂丑陋的查询。

于 2020-09-19T05:19:49.250 回答