Skip to content

Latest commit

 

History

History
89 lines (77 loc) · 3.16 KB

3.5 DAO 模式.md

File metadata and controls

89 lines (77 loc) · 3.16 KB

3.5 DAO 模式

DAO(Data Access Object):数据访问对象

数据库访问代码封装在 DAO,业务逻辑代码可以直接调用 DAO 代码,实现数据库访问和业务代码的解耦。

DAO 实现

这里采用工厂模式来实现 DAO 的创建

工厂模式介绍

作用: 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

优点:

  1. 一个调用者想创建一个对象,只要知道其名称就可以了。
  2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  3. 屏蔽产品的具体实现,调用者只关心产品的接口。

缺点: 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

本案例中

不用工厂模式

在 ITaskDAO 接口 和 TaskDAOImpl 实现类中,实现类可能随时替换,如果使用普通方法来创建 DAO,ITaskDAO dao = new TaskDAOImpl(),后续 TaskDAO 变更,则只要 TaskDAOImpl 被引用过,就要改,维护成本高。

使用工厂设计模式

对于一些种类对象,提供这些对象的创建方式,外界要使用某种类型,只需要通过工厂来获取即可,不需要自己手动创建。

假如有 100 个地方调用,不需要我们创建 100 次,则需要调用 DAOFactory.getTaskDAO() 即可。

ITaskDAO 接口

public interface ITaskDAO {
	//根据主键查任务
	Task findTaskById(long taskId);
}

TaskDAOImpl 为 ITaskDAO 实现类

/**
 * mysql> CREATE TABLE `task` (
    ->   `id` INTEGER(11) NOT NULL AUTO_INCREMENT,
    ->   `name` VARCHAR(255) NULL DEFAULT NULL,
    ->   `create_time` VARCHAR(255) NULL DEFAULT NULL,
    ->   `start_time` VARCHAR(255) NULL DEFAULT NULL,
    ->   `finish_time` VARCHAR(255) NULL DEFAULT NULL,
    ->   `task_type` VARCHAR(255) NULL DEFAULT NULL,
    ->   `task_status` VARCHAR(255) NULL DEFAULT NULL,
    ->   `task_param` MEDIUMTEXT NULL DEFAULT NULL,
    ->   PRIMARY KEY (`id`)
    -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
 */
public class TaskDAOImpl implements ITaskDAO{
	public Task findTaskById(long taskId) {
		final Task task = new Task();
		String sql = "select * from task where id=?";
		Object[] params = new Object[]{taskId};
		JDBCHelper jdbcHelper = JDBCHelper.getInstance();
		jdbcHelper.executeQuery(sql, params, new QueryCallback() {
			public void process(ResultSet rs) throws Exception {
				if (rs.next()) {
					task.taskId = rs.getLong("id");
					task.name = rs.getString("name");
					task.createTime = rs.getString("create_time");
					task.startTime = rs.getString("start_time");
					task.finishTime = rs.getString("finish_time");
					task.taskType = rs.getString("task_type");
					task.taskStatus = rs.getString("task_status");
					task.taskParam = rs.getString("task_param");
				}
			}
		});
		return task;
	}
}

DaoFactory 工厂,用于实例化 DAO

public class DaoFactory {
	public static ITaskDAO getTaskDAO() {
		return new TaskDAOImpl();
	}
}