📜  数据访问对象模式(1)

📅  最后修改于: 2023-12-03 14:54:57.883000             🧑  作者: Mango

数据访问对象模式

数据访问对象模式(Data Access Object Pattern)是一种在软件工程中应用广泛的设计模式。它的主要目的是将数据持久化及数据存储逻辑与业务逻辑分离。DAOP的目标是隐藏数据访问逻辑,以便做出更改而不需要修改架构。

模式结构

DAO-Pattern

数据访问对象模式由以下几个部分组成:

  • DAO接口:DAO接口定义了访问数据库的共同方法和其它对象执行基于这些对象的操作的方法。
  • DAO实现类:DAO实现类是实际执行数据库操作的类。
  • 业务对象/模型对象:业务对象或模型对象是指存储数据的对象。需要访问数据库以获取信息以及将此信息保存到数据库中。
  • 数据源连接:这可以是JDBC连接,也可以是使用不同连接池的连接。
优点
  • 与数据源的实际连接逻辑分开存储。
  • 具有更好的可维护性,降低了代码逻辑混乱的风险。
  • DAO可以调用其他DAO提供的方法,以组成复合应用程序。
  • DAO可与业务逻辑代码区别开来,易于管理。
  • DAO可以让技术依赖性单独编写,使业务逻辑更容易迁移。
缺点
  • 实现和维护DAO和它们的CRUD方法需要更多的代码。
  • 数据访问逻辑通过DAO隐藏,使得这种模式可能难于理解。
代码示例

实现一个简单的DAO示例。

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

public class StudentDaoImpl implements StudentDAO {
    List<Student> students;

    public StudentDaoImpl(){
        students = new ArrayList<>();
        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 " + student.getName() + " is removed 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 " + student.getRollNo() + " is updated in the database");
    }
}

public class DataAccessObjectPatternDemo {
    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() + " ]");
    }
}

public class Student {
    private String name;
    private int rollNo;

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

在上面的代码示例中,我们实现了一个简单的DAO接口,定义了增删改查的常见方法,供Student类使用。这个简单的示例展示了如何使用数据访问对象模式。