数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。以下是数据访问对象模式的参与者。

  • 数据访问对象接口(Data Access Object Interface) - 该接口定义了在一个模型对象上要执行的标准操作。
  • 数据访问对象实体类(Data Access Object concrete class) - 该类实现了上述的接口。该类负责从数据源获取数据,数据源可以是数据库,也可以是 xml,或者是其他的存储机制。
  • 模型对象/数值对象(Model Object/Value Object) - 该对象是简单的 POJO,包含了 get/set 方法来存储通过使用 DAO 类检索到的数据。

实现

我们将创建一个作为模型对象或数值对象的 Student 对象。StudentDao 是数据访问对象接口。StudentDaoImpl 是实现了数据访问对象接口的实体类。DaoPatternDemo,我们的演示类使用 StudentDao 来演示数据访问对象模式的用法。
image.png

步骤 1

创建数值对象

  1. public class Student {
  2. private String name;
  3. private int rollNo;
  4. Student(String name, int rollNo){
  5. this.name = name;
  6. this.rollNo = rollNo;
  7. }
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. public int getRollNo() {
  15. return rollNo;
  16. }
  17. public void setRollNo(int rollNo) {
  18. this.rollNo = rollNo;
  19. }
  20. }

步骤 2

创建数据访问对象接口。

  1. import java.util.List;
  2. public interface StudentDao {
  3. public List<Student> getAllStudents();
  4. public Student getStudent(int rollNo);
  5. public void updateStudent(Student student);
  6. public void deleteStudent(Student student);
  7. }

步骤3

创建实现了上述接口的实体类

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class StudentDaoImpl implements StudentDao {
  4. //列表是当作一个数据库
  5. List<Student> students;
  6. public StudentDaoImpl(){
  7. students = new ArrayList<Student>();
  8. Student student1 = new Student("Robert",0);
  9. Student student2 = new Student("John",1);
  10. students.add(student1);
  11. students.add(student2);
  12. }
  13. @Override
  14. public void deleteStudent(Student student) {
  15. students.remove(student.getRollNo());
  16. System.out.println("Student: Roll No " + student.getRollNo()
  17. +", deleted from database");
  18. }
  19. //从数据库中检索学生名单
  20. @Override
  21. public List<Student> getAllStudents() {
  22. return students;
  23. }
  24. @Override
  25. public Student getStudent(int rollNo) {
  26. return students.get(rollNo);
  27. }
  28. @Override
  29. public void updateStudent(Student student) {
  30. students.get(student.getRollNo()).setName(student.getName());
  31. System.out.println("Student: Roll No " + student.getRollNo()
  32. +", updated in the database");
  33. }
  34. }

步骤 4

使用 StudentDao 来演示数据访问对象模式的用法。

  1. public class DaoPatternDemo {
  2. public static void main(String[] args) {
  3. StudentDao studentDao = new StudentDaoImpl();
  4. //输出所有的学生
  5. for (Student student : studentDao.getAllStudents()) {
  6. System.out.println("Student: [RollNo : "
  7. +student.getRollNo()+", Name : "+student.getName()+" ]");
  8. }
  9. //更新学生
  10. Student student =studentDao.getAllStudents().get(0);
  11. student.setName("Michael");
  12. studentDao.updateStudent(student);
  13. //获取学生
  14. studentDao.getStudent(0);
  15. System.out.println("Student: [RollNo : "
  16. +student.getRollNo()+", Name : "+student.getName()+" ]");
  17. }
  18. }

步骤 5

执行程序,输出结果:

  1. Student: [RollNo : 0, Name : Robert ]
  2. Student: [RollNo : 1, Name : John ]
  3. Student: Roll No 0, updated in the database
  4. Student: [RollNo : 0, Name : Michael ]