鍍金池/ 教程/ Java/ Java數(shù)據(jù)訪問對象模式
Java前端控制器模式
Java工廠設(shè)計(jì)模式
Java抽象工廠模式
Java觀察者模式
Java門面模式(或外觀模式)
Java備忘錄模式
Java MVC模式
Java單例模式
Java傳輸對象模式
Java迭代器模式
Java責(zé)任鏈模式
Java命令模式
Java原型模式
Java解釋器模式
Java適配器模式
Java狀態(tài)模式
Java中介者模式(Mediator Pattern)
Java攔截過濾器模式
Java策略模式
Java組合模式
Java業(yè)務(wù)代理模式
Java裝飾模式
Java模板模式
Java橋接模式
Java過濾器模式(條件模式)
Java享元模式(Flyweight Pattern)
Java建造者(Builder)模式
Java設(shè)計(jì)模式
Java空對象模式
Java數(shù)據(jù)訪問對象模式
Java訪問者模式
Java組合實(shí)體模式
Java服務(wù)定位器模式

Java數(shù)據(jù)訪問對象模式

數(shù)據(jù)訪問對象模式或DAO模式用于將低級數(shù)據(jù)訪問API或操作與高級業(yè)務(wù)服務(wù)分離。 以下是數(shù)據(jù)訪問對象模式的參與者。

  • 數(shù)據(jù)訪問對象接口 - 此接口定義要對模型對象執(zhí)行的標(biāo)準(zhǔn)操作。
  • 數(shù)據(jù)訪問對象具體類 - 此類實(shí)現(xiàn)上述接口。 這個類負(fù)責(zé)從數(shù)據(jù)源獲取數(shù)據(jù),數(shù)據(jù)源可以是數(shù)據(jù)庫/xml或任何其他存儲機(jī)制。
  • 模型對象或值對象 - 此對象是簡單的POJO,包含用于存儲使用DAO類檢索的數(shù)據(jù)的get/set方法。

實(shí)現(xiàn)實(shí)例

在這個將創(chuàng)建一個作為ModelValue對象的Student對象。 StudentDao是數(shù)據(jù)訪問對象接口。 StudentDaoImpl是實(shí)現(xiàn)數(shù)據(jù)訪問對象接口的具體類。 DaoPatternDemo這是一個演示類,將使用StudentDao演示使用數(shù)據(jù)訪問對象模式。

數(shù)據(jù)訪問對象模式示例的結(jié)構(gòu)如下圖所示 -

第1步

創(chuàng)建值對象,其代碼如下 -

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步

創(chuàng)建數(shù)據(jù)訪問對象接口,其代碼如下 -

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步

創(chuàng)建實(shí)現(xiàn)上面的接口的具體類,其代碼如下 -

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演示數(shù)據(jù)訪問對象模式的使用。
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步

驗(yàn)證輸出,執(zhí)行上面的代碼得到以下結(jié)果 -

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