我在浏览一份文档时,遇到了一个叫做DAO的术语。我发现它是一个数据访问对象。谁能给我解释一下这到底是什么?

我知道它是一种用于访问来自不同类型数据源的数据的接口,在我的这个小研究中,我偶然发现了一个叫做数据源或数据源对象的概念,我的头脑中混乱了。

我真的想知道DAO在编程上是什么,以及它在哪里被使用。它是如何使用的?任何从最基本的东西解释这个概念的页面链接也很受欢迎。


当前回答

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

刀的例子

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

希望能有所帮助, 再见!

其他回答

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

这个定义来自: 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 server,以及另一个处理平面文件等。

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

刀的例子

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

希望能有所帮助, 再见!

Spring JPA DAO

例如,我们有一些实体Group。

对于这个实体,我们创建存储库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();
    }    
}

我将是一般的,而不是特定于Java,因为DAO和ORM在所有语言中都使用。

要理解DAO,首先需要理解ORM(对象关系映射)。这意味着如果你有一个名为“person”的表,列为“name”和“age”,那么你将为这个表创建object-template:

type Person {
name
age
}

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

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

DAO抽象不是您自己编写的,相反,它通常是一些开源项目的一部分,这取决于您使用的语言和框架。

现在回到主要的问题。“. .在使用的地方……”。通常情况下,如果您正在编写复杂的业务和领域特定代码,那么没有DAO将会非常困难。当然,您不需要使用提供的ORM和DAO,相反,您可以编写自己的抽象查询和本机查询。我以前也这么做过,后来几乎总是后悔。

Dao类用于重用jdbc逻辑& Dao(数据访问对象)是一种设计模式。 dao是一个简单的java类,它包含JDBC逻辑。

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

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