我在浏览一份文档时,遇到了一个叫做DAO的术语。我发现它是一个数据访问对象。谁能给我解释一下这到底是什么?
我知道它是一种用于访问来自不同类型数据源的数据的接口,在我的这个小研究中,我偶然发现了一个叫做数据源或数据源对象的概念,我的头脑中混乱了。
我真的想知道DAO在编程上是什么,以及它在哪里被使用。它是如何使用的?任何从最基本的东西解释这个概念的页面链接也很受欢迎。
我在浏览一份文档时,遇到了一个叫做DAO的术语。我发现它是一个数据访问对象。谁能给我解释一下这到底是什么?
我知道它是一种用于访问来自不同类型数据源的数据的接口,在我的这个小研究中,我偶然发现了一个叫做数据源或数据源对象的概念,我的头脑中混乱了。
我真的想知道DAO在编程上是什么,以及它在哪里被使用。它是如何使用的?任何从最基本的东西解释这个概念的页面链接也很受欢迎。
当前回答
数据访问对象管理与数据源的连接,以获取和存储数据。它抽象了业务对象的底层数据访问实现,以支持对数据源的透明访问。 数据源可以是任何数据库,如RDBMS、XML存储库或平面文件系统等。
其他回答
DAO是3层架构中的“持久性管理器”,DAO也可以设计模式,你可以参考“Gang of Four”一书。 您的应用程序服务层只需要调用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,相反,您可以编写自己的抽象查询和本机查询。我以前也这么做过,后来几乎总是后悔。
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();
}
}
我只是想用我在一个项目中经历的一个小故事来解释它。首先,我想解释为什么DAO很重要?而不是问什么是DAO?为了更好地理解。
为什么DAO很重要? 在我的项目中的一个项目中,我使用了Client.class,它包含了我们系统用户的所有基本信息。当我需要客户端时,每次我都需要在需要的地方做一个丑陋的查询。然后我觉得这降低了可读性,产生了很多冗余的样板代码。
然后我的一个高级开发人员引入了一个QueryUtils.class,其中所有的查询都是使用公共静态访问修饰符添加的,这样我就不需要到处查询了。假设当我需要激活的客户端时,我只需调用-
QueryUtils.findAllActivatedClients();
通过这种方式,我对我的代码进行了一些优化。
但是还有一个问题!!
我觉得queryutils .类增长得非常快。这个类中包含了100多个方法,读取和使用起来也非常麻烦。因为这个类包含其他域模型的查询(例如产品、类别、位置等)。
超级英雄CTO先生提出了新的解决方案DAO,最终解决了这个问题。我觉得DAO是非常特定于领域的。例如,他创建了一个名为ClientDAO.class的DAO,其中可以找到所有与Client.class相关的查询,这对我来说似乎非常容易使用和维护。巨大的QueryUtils.class被分解成许多其他领域特定的DAO,例如ProductsDAO.class, categororiesdao .class等,这使得代码更可读,更可维护,更去耦。
DAO是什么?
它是一个对象或接口,它提供了一种从数据库访问数据的简单方法,而无需每次都以可重用的方式编写复杂而丑陋的查询。