设计模式 数据访问对象模式

  • 设计模式 - 数据访问对象模式

    数据访问对象模式数据访问对象模式或DAO模式用于将底层数据访问API或操作与高层业务服务分开。以下是数据访问对象模式的参与者。
    • 数据访问对象接口-此接口定义要在模型对象上执行的标准操作。
    • 数据访问对象具体类-此类实现上述接口。此类负责从可以是数据库/ xml或任何其他存储机制的数据源获取数据。
    • 模型对象或值对象-此对象是简单的POJO,其中包含用于存储使用DAO类检索到的数据的get / set方法。
  • 实现

    我们将创建一个充当模型或值对象的Student对象。StudentDao是数据访问对象接口。StudentDaoImpl是实现数据访问对象接口的具体类。DaoPatternDemo,我们的演示课,将使用StudentDao演示如何使用数据访问对象模式。
    dp
    第1步 - 创建值对象。Student.java
    
    public class Student {
       private String name;
       private int rollNo;
    
       Student(String name, int rollNo){
          this.name = name;
          this.rollNo = rollNo;
       }
    
       public String getName() {
          return name;
       }
    
       public void setName(String name) {
          this.name = name;
       }
    
       public int getRollNo() {
          return rollNo;
       }
    
       public void setRollNo(int rollNo) {
          this.rollNo = rollNo;
       }
    }
    
    第2步 - 创建数据访问对象接口。 StudentDao.java
    
    import java.util.List;
    
    public interface StudentDao {
       public List<Student> getAllStudents();
       public Student getStudent(int rollNo);
       public void updateStudent(Student student);
       public void deleteStudent(Student student);
    }
    
    第3步 - 创建实现上述接口的具体类。StudentDaoImpl.java
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class StudentDaoImpl implements StudentDao {
            
       //list is working as a database
       List<Student> students;
    
       public StudentDaoImpl(){
          students = new ArrayList<Student>();
          Student student1 = new Student("Robert",0);
          Student student2 = new Student("John",1);
          students.add(student1);
          students.add(student2);           
       }
       @Override
       public void deleteStudent(Student student) {
          students.remove(student.getRollNo());
          System.out.println("Student: Roll No " + student.getRollNo() + ", deleted from database");
       }
    
       //retrive list of students from the database
       @Override
       public List<Student> getAllStudents() {
          return students;
       }
    
       @Override
       public Student getStudent(int rollNo) {
          return students.get(rollNo);
       }
    
       @Override
       public void updateStudent(Student student) {
          students.get(student.getRollNo()).setName(student.getName());
          System.out.println("Student: Roll No " + student.getRollNo() + ", updated in the database");
       }
    }
    
    步骤4 - 使用StudentDao演示数据访问对象模式的用法。DaoPatternDemo.java
    
    public class DaoPatternDemo {
       public static void main(String[] args) {
          StudentDao studentDao = new StudentDaoImpl();
    
          //print all students
          for (Student student : studentDao.getAllStudents()) {
             System.out.println("Student: [RollNo : " + student.getRollNo() + ", Name : " + student.getName() + " ]");
          }
    
    
          //update student
          Student student =studentDao.getAllStudents().get(0);
          student.setName("Michael");
          studentDao.updateStudent(student);
    
          //get the student
          studentDao.getStudent(0);
          System.out.println("Student: [RollNo : " + student.getRollNo() + ", Name : " + student.getName() + " ]");         
       }
    }
    
    第5步 - 验证输出。
    
    Student: [RollNo : 0, Name : Robert ]
    Student: [RollNo : 1, Name : John ]
    Student: Roll No 0, updated in the database
    Student: [RollNo : 0, Name : Michael ]