在实际的开发过程中,Dao层负责对数据库的访问,但是在操作中会发现有很多的操作时很类似的,唯一有区别的就是对相对应的实体操作有区别。
解决方法:新建一个Interface BaseDao
public interface BaseDao {
public List getAllObject(Class clazz);
public Object getObject(Class clazz, Serializable id);
public void saveObject(Object o);
public void removeObject(Class clazz, Serializable id);
public void removeObject(Object o);
public void 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);
public void flush();
}
新建一个Class BaseDaoImpl
public class BaseDaoImpl extends HibernateDaoSupport implements BaseDao
@Override
public void saveObject(Object o) {
getHibernateTemplate().saveOrUpdate(o);
}
protected int executeUpdateByHql(String hsql, Map paraMap) {
if (hsql != null) {
Query query = getSession().createQuery(hsql);
setQueryParameters(query, paraMap);
return query.executeUpdate();
}
return 0;
}
这个类里面包含两个方面的内容,一个就是接口中的一些具体实现,如public void saveObject(Object o),另一种是一些自己定义的方法,注意:这些方法是protected的方法。
在我们新建Dao的时候,要extends BaseDao。
public interface AdminUserDao extends BaseDao。因为这样的继承,在我们的新建的Dao中就有了BaseDao中的内容。
关于这种做法:可以将相关的相同的内容给抽象出来。
实际上可以认为写一个BaseDao被继承,BaseDaoImpl被继承,这样在service层就可以直接使用。关于BaseDao被BaseDaoImpl实现,可以理解为了更好的实现BaseDao里面的方法。
其实这些类似的方法可以更近一步,在Service层进行提取出来。这样在action层就可以直接调用。如
public interface BaseService {
/**
* saveOrUpdate
* @param obj
* @return
*/
public Object save(Object obj);
/**
* delete
* @param obj
*/
public void delete(Object obj);
/**
* delete
* @param clazz
* @param id
*/
public void delete(Class clazz, Serializable id);
}
public class BaseServiceImpl implements BaseService {
public BaseDao baseDao;
@Override
public void delete(Object obj) {
baseDao.removeObject(obj);
}
@Override
public void delete(Class clazz, Serializable id) {
baseDao.removeObject(clazz, id);
}
@Override
public Object save(Object obj) {
baseDao.saveObject(obj);
return obj;
}
public BaseDao getBaseDao() {
return baseDao;
}
public void setBaseDao(BaseDao baseDao) {
this.baseDao = baseDao;
}
这时有人要有疑问,既然这样,为什么不直接在BaseServiceImpl里面进行进行对数据库的操作,过滤掉Dao层。原因是我们之所以要有BaseDao的存在,是因为我们在实际项目中会有很多复杂的业务,要调用BaseDao的一些接口。