DAO模式
Data Access Object:数据访问对象
首先,你的应用程序,肯定会有业务逻辑的代码。在三层架构的web系统中,业务逻辑的代码,就是在你的Service组件里面;在我们的spark作业中,业务逻辑代码就是在我们的spark作业里面。
如果说,你不用DAO模式的话,那么所有的数据库访问的代码和逻辑会全部耦合在业务逻辑代码里面。比如,你的业务逻辑代码中,可能会充斥着JDBCHelper,定义SQL语句,处理查询返回结果等等代码。会导致业务逻辑和数据访问严重耦合。导致以后如果你只是想修改数据访问的代码,那么还得在一大堆业务逻辑的代码中去找,找到这段代码,然后去做对应的修改。
因为我们要将数据库访问的代码,封装在DAO中,然后呢,业务逻辑的代码,就可以直接去调用DAO组件,实现数据库操作的逻辑。如果这样做了以后,那么在业务逻辑的代码中,就不可能出现SQL语句、查询结果处理等等这些东西。当后面对系统进行维护的时候,如果你只是要优化一条SQL语句,那么你肯定不用跑到业务逻辑的代码里面去找到这条SQL语句,然后去修改它。。。
只需要到业务逻辑代码调用的DAO组件里面去,找到对应的SQL语句,修改,即可。
引入了DAO模式以后,就大大降低了业务逻辑层和数据访问层的耦合,大大提升了后期的系统维护的效率,并降低了时间成本。
我们自己在实现DAO模式的时候,通常来说,会将其分为两部分,一个是DAO接口;一个是DAO实现类。我们的业务的代码,通常就是面向接口进行编程;那么当接口的实现需要改变的时候,直接定义一个新的实现即可。但是对于我们的业务代码来说,只要面向接口开发就可以了。DAO的改动对业务代码应该没有任何的影响。
ITaskDAO.java
/**
* 任务管理DAO接口
* @author Administrator
*
*/
public interface ITaskDAO {
/**
* 根据主键查询任务
* @param taskid 主键
* @return 任务
*/
Task findById(long taskid);
}
TaskDAOImpl.java
import java.sql.ResultSet;
import com.ibeifeng.sparkproject.dao.ITaskDAO;
import com.ibeifeng.sparkproject.domain.Task;
import com.ibeifeng.sparkproject.jdbc.JDBCHelper;
/**
* 任务管理DAO实现类
* @author Administrator
*
*/
public class TaskDAOImpl implements ITaskDAO {
/**
* 根据主键查询任务
* @param taskid 主键
* @return 任务
*/
public Task findById(long taskid) {
final Task task = new Task();
String sql = "select * from task where task_id=?";
Object[] params = new Object[]{taskid};
JDBCHelper jdbcHelper = JDBCHelper.getInstance();
jdbcHelper.executeQuery(sql, params, new JDBCHelper.QueryCallback() {
@Override
public void process(ResultSet rs) throws Exception {
if(rs.next()) {
long taskid = rs.getLong(1);
String taskName = rs.getString(2);
String createTime = rs.getString(3);
String startTime = rs.getString(4);
String finishTime = rs.getString(5);
String taskType = rs.getString(6);
String taskStatus = rs.getString(7);
String taskParam = rs.getString(8);
task.setTaskid(taskid);
task.setTaskName(taskName);
task.setCreateTime(createTime);
task.setStartTime(startTime);
task.setFinishTime(finishTime);
task.setTaskType(taskType);
task.setTaskStatus(taskStatus);
task.setTaskParam(taskParam);
}
}
});
/**
* 说在后面的话:
*
* 大家看到这个代码,包括后面的其他的DAO,就会发现,用JDBC进行数据库操作,最大的问题就是麻烦
* 你为了查询某些数据,需要自己编写大量的Domain对象的封装,数据的获取,数据的设置
* 造成大量很冗余的代码
*
* 所以说,之前就是说,不建议用Scala来开发大型复杂的Spark的工程项目
* 因为大型复杂的工程项目,必定是要涉及很多第三方的东西的,MySQL只是最基础的,要进行数据库操作
* 可能还会有其他的redis、zookeeper等等
*
* 如果你就用Scala,那么势必会造成与调用第三方组件的代码用java,那么就会变成scala+java混编
* 大大降低我们的开发和维护的效率
*
* 此外,即使,你是用了scala+java混编
* 但是,真正最方便的,还是使用一些j2ee的开源框架,来进行第三方
* 技术的整合和操作,比如MySQL,那么可以用MyBatis/Hibernate,大大减少我们的冗余的代码
* 大大提升我们的开发速度和效率
*
* 但是如果用了scala,那么用j2ee开源框架,进来,造成scala+java+j2ee开源框架混编
* 简直会造成你的spark工程的代码上的极度混乱和惨不忍睹
* 后期非常难以维护和交接
*
*/
return task;
}
}