# 什么是 DAO 以及如何使用它

> 原文： [https://javatutorial.net/what-is-dao-and-how-to-to-use-it](https://javatutorial.net/what-is-dao-and-how-to-use-it)

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

![spring-featured-image](img/d2f73752d8ae931b119dec1eac866973.jpg)

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

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

让我们实现 DAO 模式。

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

`Employee.java`

```java
public class Employee {
	//members
	private String name;
	private String email;

	// constructor
	Employee(String n, String e) {
		name = n;
		email = e;
	}

	// setter methods
	public void setName(String n) {
		name = n;
	}

	public void setEmail(String e) {
		email = e;
	}

	// getter methods
	public String getName() {
		return name;
	}

	public String getEmail() {
		return email;
	}
}
```

**细分**

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

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

```java
public interface Dao<T> {

    Optional<T> get(long id);

    List<T> getAll();

    void save(T t);

    void update(T t, String[] params);

    void delete(T t);
}
```

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

`EmployeeDAO.java`

```java
public class EmployeeDAO implements Dao<Employee> {
	// will act as a "mini-database"
	private List<Employee> employees = new ArrayList<>();

	// Constructor
	public EmployeeDAO() {
		// Populate our list of employees with 3 Demos
		employees.add(new Employee("Demo1", "Demo1@example.com"));
		employees.add(new Employee("Demo2", "Demo2@example.com"));
		employees.add(new Employee("Demo3", "Demo3@example.com"));
	}

	// Overriding the Dao interface methods
	@Override
	public Employee get(long id) {
		return employees.get((int) id));
	}

	@Override 
	public List<Employee> getAll() {
		return employees;
	}

	@Override
	public void save(Employee emp) {
		employees.add(emp);
	}

	@Override
	public void update(Employee employee, String[] params) {
		// Check for validity
		if (params[0].length() != 0|| params[1].length() != 0) {
			// Initialize the employee
			employee.setName(params[0]);
			employee.setEmail(params[1]);

			// Add the Initialized employee to the list of employees (a.k.a. DB)
			employees.add(employee);
		}
	}

	@Override
	public void delete(Employee employee) {
		employees.remove(employee);
	}
}
```

**细分**

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

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

`DemoApplication.java`

```java
public class DemoApplication {
	// Declare an instance of Dao
	private static Dao employeeDao;

	public static void main (String[] args) {
		employeeDao = new EmployeeDAO();
		Employee demoEmployee1 = getEmployee(0);

		employeeDao.update(demoEmployee1, new String[] {
			"Hugh",
			"hugh.demo@demo.com"
		});

		Employee demoEmployee2 = getEmployee(1);

		employeeDao.update(demoEmployee2, new String[] {
			"Marry",
			"marry.demo@demo.com"
		});

		Employee demoEmployee3 = getEmployee(2);

		employeeDao.update(demoEmployee3, new String[] {
			"Sharry",
			"sharry.demo@demo.com"
		});

		// print all the employee in the database
		for (Employee emp : employeeDao.getAll()) {
			System.out.println(emp.getName());
		}

		// add an entry to the database
		Employee newDemoEmp = new Employee("Slim", "slimmy@demo.com");
		employeeDao.save(newDemoEmp);

		// print all the employee in the database after we have added another entry
		for (Employee emp : employeeDao.getAll()) {
			System.out.println(emp.getName());
		}
	}

	private static Employee getEmployee(long id) {
		// Fetch the employee from the Database based on the id provided
		// Keep in mind that the .get method used below is coming from the DAO class
		Employee emp = employeeDao.get(id);

		// Return that employee
		return emp;
	}
}
```

**细分**

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

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

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

## 结论

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

简而言之， **DAO 为您的服务提供数据**。