设计模式 之 数据访问对象模式(DAO模式)详解

设计模式 同时被 2 个专栏收录
3 篇文章 0 订阅
7 篇文章 0 订阅

设计模式 之 数据访问对象模式(DAO模式)详解

导语

最近在做对数据库进行操作的Java编程,为了追求更好的封装性,实现代码的低耦合高复用,我了解了数据访问对象模式(Data Access Object Pattern),即DAO模式。

同时我对之前写的代码进行了复盘与改进。这篇就主要介绍一下什么是DAO模式,以及示例用法。

DAO模式

DAO模式是为了将低级的数据访问API从高级的业务服务中分离出来,也是为了实现低耦合、高复用。

DAO模式属于J2EE设计模式的一种,特别关注表示层。

DAO模式主要有三个参与者:

  • 数据访问对象接口: 定义在一个模型对象上要执行的标准操作
  • 数据访问对象实体类:实现数据访问对象接口,负责从数据库等存储机制中获取数据
  • 模型对象/数值对象:用来存储获取到的数据的类对象

以下是DAO模式的UML图:
在这里插入图片描述
该图中:
StudentDao担当的是数据访问接口对象的角色,规定了对student类型的数据要进行那些操作;

StudentDaoImpl担当的是数据访问对象实体类的角色,实现了StudentDao接口,也就是具体实现了如何从数据库获取数据,来进行这些增删改查的操作;

Student担当的是模型对象的角色,用来存储获取到的student类型的数据,利用它作为中介来完成对数据库的实际操作。

DAO模式的实现

我们根据方才展示的UML逻辑来实现DAO模式。

以我对Person的数据库的操作为例:
在这里插入图片描述
这四个.java文件恰好实现了对person类数据操作的DAO模式。

首先是实体类Person,主要包含属性和getter/setter方法:

package com.web.xiaohan.entity;

import java.io.Serializable;

public class Person implements Serializable{
	private String username;
	private String name;
	private int age = 0;
	private String telenum;
	public String getUsername() {
		return username;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
	public String getTelenum() {
		return telenum;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setTelenum(String telenum) {
		this.telenum = telenum;
	}
}

然后是PersonDao接口,主要包含获取所有person、以及增删改查五种操作:

package com.web.xiaohan.dao;

import java.util.List;

import com.web.xiaohan.entity.Person;

public interface PersonDao {
	public List<Person> getAllPerson();
	public boolean addPerson(Person person);
	public boolean deletePerson(String username);
	public boolean updatePerson(Person person);
	public Person selectPersonByName(String name);
}

接着是PersonDaoImpl类,实现了PersonDao接口中的所有抽象方法,这里只放个大概,具体的实现方法根据不同的业务逻辑与需求也有不同:

package com.web.xiaohan.dao;
import java.util.List;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import com.web.xiaohan.entity.*;

public class PersonDaoImpl implements PersonDao{
	
	public List<Person> getAllPerson() { // 查询所有信息
		List<Person> list = new ArrayList<Person>(); // 创建集合
		... ...
		return list; // 返回一个集合
	}
 
	@Override
	public boolean addPerson(Person person) {
		... ...
		return false;
	}
	
	@Override
	public boolean updatePerson(Person person) {
		// TODO Auto-generated method stub
		... ...
		return false;
	}
	
	@Override
	public boolean deletePerson(String username) {
		// TODO Auto-generated method stub
		... ...
		return false;
	}

	@Override
	public Person selectPersonByName(String name) {
		// TODO Auto-generated method stub
		Person person = null;
		... ...
		return person;
	}
}

最后,是DaoPatternDemo,里面包含main方法,来调用方法:

package com.web.xiaohan.dao;

import com.web.xiaohan.entity.Person;
import com.web.xiaohan.entity.Users;

public class DaoPatternDemo {

	public static void main(String[] args) {
		PersonDao personDao = new PersonDaoImpl();
		
		Person person = new Person();
		person.setName("test");
		person.setUsername("user123");
		personDao.addPerson(person);
		
		System.out.println("=========Person=========");
		System.out.println("username\tname\tage\ttelenum");
		for (Person myperson : personDao.getAllPerson()) {
	         System.out.print(myperson.getUsername()+"\t"+myperson.getName()+"\t");
	         if(myperson.getAge()!=0)
	        	 System.out.print(myperson.getAge());
	         System.out.print("\t");
	         if(myperson.getTelenum()!=null)
	        	 System.out.print(myperson.getTelenum());
	         System.out.println("\t");
	    }
	}
}

我们可以注意到,在实际的调用过程中,采用的声明方式是:

	PersonDao personDao = new PersonDaoImpl();

这样的好处在于,当业务逻辑改变时,无需修改PersonDaoImpl的代码,而只需要另外写一个类(比如PersonDaoImpl2)来实现PersonDao接口。与此同时,DaoPatternDemo中的其他部分也不用修改,只需修改这一句。因为声明时是PersonDao。

要时刻记得面向对象的原则是开闭原则,对扩展开放,对修改关闭。这样有利于代码的维护。

结束语

这篇主要介绍了DAO模式的使用。

熟练运用好设计模式,可能在小项目的开发过程中是比较繁琐的,但这是一种好的代码规范。养成这种习惯,在开发大项目时,思路规划会更加清晰,代码的扩展和维护也会更加游刃有余。

  • 6
    点赞
  • 1
    评论
  • 6
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值