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

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

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

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

461034 次浏览

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

定义来自: http://en.wikipedia.org/wiki/Data_access_object < / p >

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

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

假设我们有一个实体来代表一个雇员:

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示例

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

希望能有所帮助 再见!< / p >

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

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

数据访问对象接口——这个接口定义了要在模型对象上执行的标准操作。

数据访问对象具体类——这个类实现了上面的接口。该类负责从数据源获取数据,数据源可以是database / xml或任何其他存储机制。

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

示例代码在这里..

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

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

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

为什么使用dao:

从数据资源(如数据库)中抽象检索数据。
这个概念是将数据资源的客户端接口与其数据访问机制分离。
< / p >

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

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

DAO模式由以下内容组成:

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

看例子 < br >

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

DAO是一个类似于3层架构中的“持久性管理器”的行为,DAO也可以设计模式,你可以参考“四人行”一书。 你的应用服务层只需要调用DAO类的方法,不需要知道hidden &DAO方法的内部细节
Pojo也可以考虑作为Java中的Model类,在那里我们可以为私有定义的特定变量创建getter和setter。 记住这里所有变量都声明为私有修饰符

Dao类用于重用jdbc逻辑&Dao(数据访问对象)是一种设计模式。

. dao是一个简单的java类,包含JDBC逻辑

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

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

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

我将是一般的,而不是特定于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,相反,您可以编写自己的抽象查询和本机查询。我以前也这么做过,后来几乎总是后悔。

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

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

< p > 为什么DAO很重要?
在我的项目中的一个项目中,我使用了Client.class,它包含了我们系统用户的所有基本信息。当我需要客户端时,每次我都需要在需要的地方做一个丑陋的查询。然后我觉得这会减少可读性,并使许多多余的样板代码.

然后我的一个高级开发人员引入了QueryUtils.class,其中所有查询都使用public static访问修饰符添加,这样我就不需要到处查询了。假设当我需要激活的客户时,我只需调用-

QueryUtils.findAllActivatedClients();

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

但是还有一个问题!!< / >强

我觉得queryutils .类增长得非常快。这个类中包含了100多个方法,读取和使用起来也非常麻烦。因为这个类包含另一个域模型(例如:产品、类别、地点等)的其他查询。

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

DAO是什么?

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