1. 程式人生 > >大資料專案實戰之十:10.DAO模式講解以及TaskDAO開發

大資料專案實戰之十:10.DAO模式講解以及TaskDAO開發

Data Access Object:資料訪問物件

首先,你的應用程式,肯定會有業務邏輯的程式碼。在三層架構的web系統中,業務邏輯的程式碼,就是在你的Service元件裡面;在我們的spark作業中,業務邏輯程式碼就是在我們的spark作業裡面。

如果說,你不用DAO模式的話,那麼所有的資料庫訪問的程式碼和邏輯會全部耦合在業務邏輯程式碼裡面。比如,你的業務邏輯程式碼中,可能會充斥著JDBCHelper,定義SQL語句,處理查詢返回結果等等程式碼。會導致業務邏輯和資料訪問嚴重耦合。導致以後如果你只是想修改資料訪問的程式碼,那麼還得在一大堆業務邏輯的程式碼中去找,找到這段程式碼,然後去做對應的修改。

因為我們要將資料庫訪問的程式碼,封裝在DAO中,然後呢,業務邏輯的程式碼,就可以直接去呼叫DAO元件,實現資料庫操作的邏輯。如果這樣做了以後,那麼在業務邏輯的程式碼中,就不可能出現SQL語句、查詢結果處理等等這些東西。當後面對系統進行維護的時候,如果你只是要優化一條SQL語句,那麼你肯定不用跑到業務邏輯的程式碼裡面去找到這條SQL語句,然後去修改它。。。

只需要到業務邏輯程式碼呼叫的DAO元件裡面去,找到對應的SQL語句,修改,即可。

引入了DAO模式以後,就大大降低了業務邏輯層和資料訪問層的耦合,大大提升了後期的系統維護的效率,並降低了時間成本。

我們自己在實現DAO模式的時候,通常來說,會將其分為兩部分,一個是DAO介面;一個是DAO實現類。我們的業務的程式碼,通常就是面向介面進行程式設計;那麼當介面的實現需要改變的時候,直接定義一個新的實現即可。但是對於我們的業務程式碼來說,只要面向介面開發就可以了。DAO的改動對業務程式碼應該沒有任何的影響。
 

import java.io.Serializable;

//任務
public class Task implements Serializable {


    private static final long serialVersionUID = 3518776796426921776L;


    private long taskid;
    private String taskname;
    private String createtime;
    private String starttime;
    private String finishtime;
    private String tasktype;
    private String taskstatus;
    private String taskparam;

    public long getTaskid() {
        return taskid;
    }

    public void setTaskid(long taskid) {
        this.taskid = taskid;
    }

    public String getTaskname() {
        return taskname;
    }

    public void setTaskname(String taskname) {
        this.taskname = taskname;
    }

    public String getCreatetime() {
        return createtime;
    }

    public void setCreatetime(String createtime) {
        this.createtime = createtime;
    }

    public String getStarttime() {
        return starttime;
    }

    public void setStarttime(String starttime) {
        this.starttime = starttime;
    }

    public String getFinishtime() {
        return finishtime;
    }

    public void setFinishtime(String finishtime) {
        this.finishtime = finishtime;
    }

    public String getTasktype() {
        return tasktype;
    }

    public void setTasktype(String tasktype) {
        this.tasktype = tasktype;
    }

    public String getTaskstatus() {
        return taskstatus;
    }

    public void setTaskstatus(String taskstatus) {
        this.taskstatus = taskstatus;
    }

    public String getTaskparam() {
        return taskparam;
    }

    public void setTaskparam(String taskparam) {
        this.taskparam = taskparam;
    }
}
/**
 * 任務管理DAO介面
 * @author Administrator
 *
 */
public interface ITaskDAO {
	
	/**
	 * 根據主鍵查詢任務
	 * @param taskid 主鍵
	 * @return 任務
	 */
	Task findById(long taskid);
	
}
/**
 * 任務管理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);  
				}
			}
			
		});
		
		
		return task;
	}