1. 程式人生 > >MVC對Dao層的解決方法(MVC的設計)

MVC對Dao層的解決方法(MVC的設計)

在實際的開發過程中,Dao層負責對資料庫的訪問,但是在操作中會發現有很多的操作時很類似的,唯一有區別的就是對相對應的實體操作有區別。

解決方法:新建一個InterfaceBaseDao

publicinterface BaseDao {

public List getAllObject(Class clazz);

public Object getObject(Class clazz, Serializable id);

publicvoid saveObject(Object o);

publicvoid removeObject(Class clazz, Serializable id);

publicvoid removeObject(Object o);

publicvoid removeAllObject(Collection collection);

public Object findBy(Class clazz , String name, Object value);

public List findLike(Class clazz, String name, String value);

public List findAllBy(Class clazz , String name, Object value);

publicvoid flush();

}

新建一個Class BaseDaoImpl

public class BaseDaoImpl extends HibernateDaoSupport implements BaseDao

@Override

publicvoid saveObject(Object o) {

getHibernateTemplate().saveOrUpdate(o);

}

protectedint executeUpdateByHql(String hsql, Map paraMap) {

if (hsql != null) {

Query query = getSession().createQuery(hsql);

setQueryParameters(query, paraMap);

return query.executeUpdate();

}

return 0;

}

這個類裡面包含兩個方面的內容,一個就是介面中的一些具體實現,如publicvoid saveObject(Object o),另一種是一些自己定義的方法,注意:這些方法是protected的方法。

在我們新建Dao的時候,要extends BaseDao

publicinterface AdminUserDao extends BaseDao。因為這樣的繼承,在我們的新建的Dao中就有了BaseDao中的內容。

關於這種做法:可以將相關的相同的內容給抽象出來。

實際上可以認為寫一個BaseDao被繼承,BaseDaoImpl被繼承,這樣在service層就可以直接使用。關於BaseDaoBaseDaoImpl實現,可以理解為了更好的實現BaseDao裡面的方法。

其實這些類似的方法可以更近一步,在Service層進行提取出來。這樣在action層就可以直接呼叫。如

publicinterface BaseService {

/**

* saveOrUpdate

* @param obj

* @return

*/

public Object save(Object obj);

/**

* delete

* @param obj

*/

publicvoid delete(Object obj);

/**

* delete

* @param clazz

* @param id

*/

publicvoid delete(Class clazz, Serializable id);

}

publicclass BaseServiceImpl implements BaseService {

public BaseDao baseDao;

@Override

publicvoid delete(Object obj) {

baseDao.removeObject(obj);

}

@Override

publicvoid delete(Class clazz, Serializable id) {

baseDao.removeObject(clazz, id);

}

@Override

public Object save(Object obj) {

baseDao.saveObject(obj);

return obj;

}

public BaseDao getBaseDao() {

returnbaseDao;

}

publicvoid setBaseDao(BaseDao baseDao) {

this.baseDao = baseDao;

}

這時有人要有疑問,既然這樣,為什麼不直接在BaseServiceImpl裡面進行進行對資料庫的操作,過濾掉Dao層。原因是我們之所以要有BaseDao的存在,是因為我們在實際專案中會有很多複雜的業務,要呼叫BaseDao的一些介面。