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層就可以直接使用。關於BaseDao被BaseDaoImpl實現,可以理解為了更好的實現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的一些介面。