原文: https://javatutorial.net/what-is-dao-and-how-to-to-use-it

在开始实现这些类之前,我们首先要了解什么是 DAO。 如果您已经知道 DAO 是什么,请随时跳转至代码示例。 如果没有,请忍受我。

什么是 DAO 以及如何使用它 - 图1

DAO 代表数据访问对象,它是一种结构化模式,它通过使用抽象 API 将业务层(逻辑)与持久层(例如数据库)隔离开来。

简而言之,对象(DAO)提供了数据库的抽象接口。 肯定的是,应用程序(业务层/逻辑)不知道有关数据库的任何详细信息,因为这是 DAO 的工作。 它分离业务逻辑和数据

让我们实现 DAO 模式。

使用 DAO 时,最著名的示例是用户 - 名称,电子邮件,密码。 在本文中,我将使用员工示例 – 名称,电子邮件。

Employee.java

  1. public class Employee {
  2. //members
  3. private String name;
  4. private String email;
  5. // constructor
  6. Employee(String n, String e) {
  7. name = n;
  8. email = e;
  9. }
  10. // setter methods
  11. public void setName(String n) {
  12. name = n;
  13. }
  14. public void setEmail(String e) {
  15. email = e;
  16. }
  17. // getter methods
  18. public String getName() {
  19. return name;
  20. }
  21. public String getEmail() {
  22. return email;
  23. }
  24. }

细分

上一个类没什么大不了的。 一个标准的构造函数 /setter/getter 方法类。

在编写EmployeeDAO类之前,我们首先来看一下Dao<T>接口包含的内容。

  1. public interface Dao<T> {
  2. Optional<T> get(long id);
  3. List<T> getAll();
  4. void save(T t);
  5. void update(T t, String[] params);
  6. void delete(T t);
  7. }

它具有getgetAllsaveupdatedelete方法。 简而言之,对类型T的对象执行 CRUD 操作。现在,我们的下一个目标是在EmployeeDAO.java类中实现该接口。

EmployeeDAO.java

  1. public class EmployeeDAO implements Dao<Employee> {
  2. // will act as a "mini-database"
  3. private List<Employee> employees = new ArrayList<>();
  4. // Constructor
  5. public EmployeeDAO() {
  6. // Populate our list of employees with 3 Demos
  7. employees.add(new Employee("Demo1", "Demo1@example.com"));
  8. employees.add(new Employee("Demo2", "Demo2@example.com"));
  9. employees.add(new Employee("Demo3", "Demo3@example.com"));
  10. }
  11. // Overriding the Dao interface methods
  12. @Override
  13. public Employee get(long id) {
  14. return employees.get((int) id));
  15. }
  16. @Override
  17. public List<Employee> getAll() {
  18. return employees;
  19. }
  20. @Override
  21. public void save(Employee emp) {
  22. employees.add(emp);
  23. }
  24. @Override
  25. public void update(Employee employee, String[] params) {
  26. // Check for validity
  27. if (params[0].length() != 0|| params[1].length() != 0) {
  28. // Initialize the employee
  29. employee.setName(params[0]);
  30. employee.setEmail(params[1]);
  31. // Add the Initialized employee to the list of employees (a.k.a. DB)
  32. employees.add(employee);
  33. }
  34. }
  35. @Override
  36. public void delete(Employee employee) {
  37. employees.remove(employee);
  38. }
  39. }

细分

由于实现了 Dao代码,我们可以访问所有被覆盖的方法,因为我们从 Dao API。 如评论中所述,为了简单起见,可以将雇员列表视为数据库。 您现在可以看到为什么这种模式非常强大,更重要的是,它是如何工作的吗? 存在Employee类和EmployeeDAO而不相互依赖。 如果您熟悉 OO(面向对象)概念,则可以将此关系与 OOP 世界中的聚合相关联。

现在是时候创建应用程序了,也就是业务层或逻辑。

DemoApplication.java

  1. public class DemoApplication {
  2. // Declare an instance of Dao
  3. private static Dao employeeDao;
  4. public static void main (String[] args) {
  5. employeeDao = new EmployeeDAO();
  6. Employee demoEmployee1 = getEmployee(0);
  7. employeeDao.update(demoEmployee1, new String[] {
  8. "Hugh",
  9. "hugh.demo@demo.com"
  10. });
  11. Employee demoEmployee2 = getEmployee(1);
  12. employeeDao.update(demoEmployee2, new String[] {
  13. "Marry",
  14. "marry.demo@demo.com"
  15. });
  16. Employee demoEmployee3 = getEmployee(2);
  17. employeeDao.update(demoEmployee3, new String[] {
  18. "Sharry",
  19. "sharry.demo@demo.com"
  20. });
  21. // print all the employee in the database
  22. for (Employee emp : employeeDao.getAll()) {
  23. System.out.println(emp.getName());
  24. }
  25. // add an entry to the database
  26. Employee newDemoEmp = new Employee("Slim", "slimmy@demo.com");
  27. employeeDao.save(newDemoEmp);
  28. // print all the employee in the database after we have added another entry
  29. for (Employee emp : employeeDao.getAll()) {
  30. System.out.println(emp.getName());
  31. }
  32. }
  33. private static Employee getEmployee(long id) {
  34. // Fetch the employee from the Database based on the id provided
  35. // Keep in mind that the .get method used below is coming from the DAO class
  36. Employee emp = employeeDao.get(id);
  37. // Return that employee
  38. return emp;
  39. }
  40. }

细分

即使上面的代码被大量注释,我仍将添加一些注意事项。 在我们的main方法之上,我们声明一个 Dao 实例,该实例将用于我们之前使用的被覆盖的方法。

注意我们如何在此类中创建另一个名为getEmployee(long id)的 getter 方法。 此方法使用另一种get(long id)"方法。 内部的get方法是我们在EmployeeDAO类中覆盖的方法。 在获取了具有给定 ID 的员工之后,我们对其进行分配,然后我们立即使用update方法来取代。 我们传递了要更新的员工实例以及要给该员工的新名称和新电子邮件。

此后,我们使用覆盖的getAll()方法,这使我们返回了员工列表。 之后,我们只需将一个新创建的Employee添加到列表中,然后再次打印该雇员,现在再添加 1 个条目。

结论

DAO 应该执行数据库操作并以类外可以访问的方式组织数据。通常,使用 DAO 类的类是Application本身或您拥有的Service类。

简而言之, DAO 为您的服务提供数据