什么是DAO,如何使用DAO
在我开始实现这些类之前,让我们首先了解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()方法,我们重写了该方法,该方法返回员工列表。之后,我们只需将一个新创建的员工添加到列表中,然后再次打印员工,现在又有一个条目。