Java中的数据访问对象(DAO)

Vas*_*K V 319 java dao

我正在浏览一份文件而且我遇到了一个叫做的术语DAO.我发现它是一个数据访问对象.有人可以解释一下这究竟是什么吗?

我知道它是某种用于访问来自不同类型数据源的数据的接口,在我的这个小小的研究中,我碰到了一个名为数据源或数据源对象的概念,事情在我的脑海中搞砸了.

我真的想知道DAO在使用它的位置方面是什么.如何使用?任何从非常基本的东西解释这个概念的页面的链接也是值得赞赏的.

Ram*_*ami 414

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

该定义来自: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;
    }

}
Run Code Online (Sandbox Code Playgroud)

员工实体将持久保存到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);

}
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,顾名思义,DAO用于访问/更新某个实体/类的底层存储.因此,在上面的示例中,我们有一个员工类/实体,我们使用SQL服务器数据库表来保持.Employee DAO将包含插入/删除/更新/选择员工的方法 (5认同)
  • 所以DAO都是?? 它只是我们正在编写的一个用于访问数据库的类.每当我们需要来自数据库的服务时,我们创建一个DAO对象,将其用于数据库操作,然后在我们从数据库中得到我们想要的东西后摆脱DAO.我对吗??我可以知道这个DAO概念rami的范围吗? (4认同)
  • 嗨rami,我真的很高兴你尝试用一个非常简单的exaple来解释我,这就是我所需要的.你可以用'具体实现'来解释你的意思吗?你的意思是我们必须通过实现类的接口来编写方法的定义吗??? (3认同)
  • @PhilipRego我们当然可以有多种实现,例如MSSQL服务器实现,以及另一种使用CSV文件与单元测试一起使用的实现。 (2认同)

Vde*_*deX 77

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

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

为什么我们使用DAO:

它抽象从数据资源(如数据库)中检索数据.这个概念是"将数据资源的客户端接口与其数据访问机制分开".

直接访问数据的问题是数据源可能会发生变化.例如,考虑您的应用程序部署在访问Oracle数据库的环境中.然后将其部署到使用Microsoft SQL Server的环境中.如果您的应用程序使用存储过程和特定于数据库的代码(例如生成数字序列),那么如何在应用程序中处理它?您有两种选择:

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


它全部称为DAO模式,它包括以下内容:

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

请查看此示例,这将更清楚地清楚.

示例
我假设这些事情必须在一定程度上清除您对DAO的理解.


uma*_*llo 13

DAO(数据访问对象)是企业应用程序中非常常用的设计模式.它基本上是用于从每个源(DBMS,XML等)访问数据的模块.我建议你阅读一些例子,比如这个:

DAO示例

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

希望它有所帮助,再见!

  • DAO示例链接没有用 (2认同)

Orh*_*han 7

我将是通用的,而不是特定于 Java 的,因为 DAO 和 ORM 用于所有语言。

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

type Person {
name
age
}
Run Code Online (Sandbox Code Playgroud)

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

list persons = DAO.getPersons();
...
person = DAO.getPersonWithName("John");
age = person.age;
Run Code Online (Sandbox Code Playgroud)

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

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


小智 6

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

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

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

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

示例代码在这里 ..


Ioa*_*oan 5

我认为最好的例子(连同解释)可以在oracle网站上找到:here。在这里可以找到另一种很好的教学方法。

  • 是我还是大多数Java教程和信息站点都过时了?该教程来自2008年!有关Java主题的许多顶级搜索结果甚至更旧。 (2认同)
  • @ bergie3000:这种模式不是新的。 (2认同)

Aru*_*ven 5

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


And*_*riy 5

Spring JPA DAO

例如我们有一些实体组。

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

public interface GroupRepository extends JpaRepository<Group, Long> {   
}
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@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();
    }    
}
Run Code Online (Sandbox Code Playgroud)