Data Access Object 模式怎么用?DAO 设计模式在项目中如何实现数据访问?

文章导读
Previous Quiz Next 概述 Data Access Object Pattern(数据访问对象模式)或 DAO pattern 用于将低级数据访问 API 或操作与高级业务服务分离。以下是 Data Access Object Pattern 中的参与者。
📋 目录
  1. 概述
  2. 实现
  3. 步骤 1
  4. 步骤 2
  5. 步骤 3
  6. 示例 - 数据访问对象模式的使用
A A

数据访问对象模式



Previous
Quiz
Next

概述

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

  • Data Access Object Interface - 该接口定义了对 model object(s) 执行的标准操作。

  • Data Access Object concrete class - 该类实现上述接口。该类负责从数据源获取数据,数据源可以是 database / xml 或任何其他存储机制。

  • Model Object 或 Value Object - 该对象是一个简单的 POJO,包含使用 DAO class 检索到的数据的 get/set 方法。

实现

我们将创建一个 Student 对象作为 Model 或 Value Object。StudentDao 是 Data Access Object Interface。StudentDaoImpl 是实现 Data Access Object Interface 的 concrete class。DaoPatternDemo,我们的 demo class,将使用 StudentDao 来演示 Data Access Object pattern 的使用。

Data Access Object Pattern UML Diagram

步骤 1

创建 Value Object。

Student.java

package com.;

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

创建 Data Access Object Interface。

StudentDao.java

package com.;

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

创建实现上述接口的 concrete class。

StudentDaoImpl.java

package com.;

import java.util.ArrayList;
import java.util.List;

public class StudentDaoImpl implements StudentDao {
	
   //list 作为 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");
   }

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

示例 - 数据访问对象模式的使用

使用 StudentDao 来演示 Data Access Object 模式的使用。

DaoPatternDemo.java

package com.;

import java.util.ArrayList;
import java.util.List;

public class DaoPatternDemo {
   public static void main(String[] args) {
      StudentDao studentDao = new StudentDaoImpl();

      //打印所有学生
      for (Student student : studentDao.getAllStudents()) {
         System.out.println("Student: [RollNo : " + student.getRollNo() + ", Name : " + student.getName() + " ]");
      }

      //更新学生
      Student student =studentDao.getAllStudents().get(0);
      student.setName("Michael");
      studentDao.updateStudent(student);

      //获取学生
      studentDao.getStudent(0);
      System.out.println("Student: [RollNo : " + student.getRollNo() + ", Name : " + student.getName() + " ]");		
   }
}

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

interface StudentDao {
   public List<Student> getAllStudents();
   public Student getStudent(int rollNo);
   public void updateStudent(Student student);
   public void deleteStudent(Student student);
}

class StudentDaoImpl implements StudentDao {
	
   //list 充当数据库
   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");
   }

   //从数据库检索学生列表
   @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");
   }
}

输出

验证输出结果。

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