DAO(Data Access Object):数据访问对象
数据库访问代码封装在 DAO,业务逻辑代码可以直接调用 DAO 代码,实现数据库访问和业务代码的解耦。
这里采用工厂模式来实现 DAO 的创建
作用: 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点: 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
不用工厂模式
在 ITaskDAO 接口 和 TaskDAOImpl 实现类中,实现类可能随时替换,如果使用普通方法来创建 DAO,ITaskDAO dao = new TaskDAOImpl(),后续 TaskDAO 变更,则只要 TaskDAOImpl 被引用过,就要改,维护成本高。
使用工厂设计模式
对于一些种类对象,提供这些对象的创建方式,外界要使用某种类型,只需要通过工厂来获取即可,不需要自己手动创建。
假如有 100 个地方调用,不需要我们创建 100 次,则需要调用 DAOFactory.getTaskDAO() 即可。
public interface ITaskDAO {
//根据主键查任务
Task findTaskById(long taskId);
}
/**
* 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;
}
}
public class DaoFactory {
public static ITaskDAO getTaskDAO() {
return new TaskDAOImpl();
}
}