什么是DAO,如何使用DAO

时间:2020-02-23 14:34:43  来源:igfitidea点击:

在我开始实现这些类之前,让我们首先了解DAO是什么。如果我们已经知道DAO是什么,可以跳到代码示例。如果没有,请忍受我。

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

简单地说,对象(DAO)为数据库提供了一个抽象接口。积极的一面是应用程序*(业务层/逻辑)*不知道数据库的任何细节,因为这是DAO的工作。 它将业务逻辑和数据分开

让我们实现DAO模式。

使用DAO时给出的最著名的例子是User–name,email,password. 在本文中,我将使用一个Employee–name,email**示例。

雇员.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>接口包含什么。

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

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", "[email protected]"));
		employees.add(new Employee("Demo2", "[email protected]"));
		employees.add(new Employee("Demo3", "[email protected]"));
	}

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

故障

多亏了 implements Dao<Employee>代码,我们可以访问我们重写的所有方法,因为我们是从*[daoapi]*获取该功能的。

如注释中所述,为了简单起见,可以将员工名单视为一个数据库。现在你能明白为什么这种模式非常强大,更重要的是,它是如何工作的吗?Employee类和EmployeeDAO不依赖于彼此而存在。如果你熟悉OO(面向对象)的概念,那么你可以将这种关系与OOP世界中的 聚合联系起来。

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

演示应用程序.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",
			"[email protected]"
		});

		Employee demoEmployee2 = getEmployee(1);

		employeeDao.update(demoEmployee2, new String[] {
			"Marry",
			"[email protected]"
		});

		Employee demoEmployee3 = getEmployee(2);

		employeeDao.update(demoEmployee3, new String[] {
			"Sharry",
			"[email protected]"
		});

		//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", "[email protected]");
		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实例,我们将使用它来使用前面所做的重写方法。

请注意,我们是如何在这个类中创建另一个getter方法的,称为“getEmployee(long id)”。此方法使用另一个“ **get(long id)” 方法。内部get方法是我们在EmployeeDAO类中重写的方法。在我们获取了具有给定id的员工之后,我们分配它,然后直接使用我们重写的 update方法。我们正在传递要更新的employee实例以及要给该员工的新名称和新电子邮件。

之后,我们使用getAll()方法,我们重写了该方法,该方法返回员工列表。之后,我们只需将一个新创建的员工添加到列表中,然后再次打印员工,现在又有一个条目。