日期:2014-05-17  浏览次数:20739 次

dao层可以不可以只使用一个公共dao
dao都是每个表一个接口一个实现,大概都是实现CRUD方法,可以不可以是用一个类,有CRUD这些基础方法 (这个类可以实现某个接口),但是不是每个表建一个,而是所有service仅仅是用下面这个公共dao
 

Java code

package cn.org.ccs.iis.dao;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import cn.org.ccs.iis.util.MyBeanUtils;
import cn.org.ccs.iis.util.Page;

public class BaseDao extends HibernateDaoSupport {
    /**
     * @description 保存对象
     * @param obj 保存的对象
     */
    public void save(Object obj) {
        this.getHibernateTemplate().save(obj);
    };
    
    /**
     * @description 更新对象
     * @param obj 更新的对象
     */
    public void update(Object obj) {
        this.getHibernateTemplate().update(obj);
    }
    
    /**
     * @description 根据参数对象更新数据库对象
     * @param original 根据此对象不为空的属性更新数据库中的对象
     * @param id 需要更新对象的id
     * @param nullProperties 需要设置为空的属性
     * @throws Exception
     */
    public Object update(Object original,Serializable id,Object[] nullProperties) throws Exception{
        Object dest = this.findById(original.getClass(), id);
        MyBeanUtils.copyNotNullProperties(dest, original);
        MyBeanUtils.setObjNullProperties(dest, nullProperties);
        this.getHibernateTemplate().update(dest);
        return dest;
    }
    
    /**
     * @description 删除对象
     * @param obj 删除的对象 对象要有主键
     */
    public void delete(Object obj) {
        this.getHibernateTemplate().delete(obj);
    }
    
    /**
     * @description 根据id删除对象
     * @param c 删除的对象类型
     * @param id 删除的对象的主键
     */
    public void delete(Class c,Serializable id){
        Object obj = findById(c,id);
        this.delete(obj);
    }
    
    /**
     * @description 保存或更新对象
     * @param obj 保存或更新的对象 有主键则是更新 没有主键则是保存
     */
    public void saveOrUpdate(Object obj){
        this.getHibernateTemplate().saveOrUpdate(obj);
    }
    
    /**
     * @description 根据id查找对象
     * @param c 对象的类
     * @param id 对象的id
     * @return 
     */
    @SuppressWarnings("unchecked")
    public Object findById(Class c,Serializable id){
        return this.getHibernateTemplate().get(c, id);
    }
    
    
    /**
     * @description hql基础查询
     * @param hql hql查询语句
     * @param params 条件的值,对应hql中的"?"
     * @param currPage 当前页
     * @param pageSIze 每页显示条目数量
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<Object> findByHql(final String hql,final Object[] params,final int currPage,final int pageSize) {
        return this.getHibernateTemplate().executeFind(new HibernateCallback() {
            public Object doInHibernate(Session session) {
                Query query = session.createQuery(hql);
                if(params!=null && params.length>0){
                    for(int i = 0 , j = params.length ; i < j ; i++){
                        query.setParameter(i,params[i]);
                    }
                }
                if (currPage >= 1 && pageSize >= 1) {
                    query.setFirstResult((currPage - 1) * pageSize);
                    query.setMaxResults(pageSize);
                }
                return query.list();
            }
        });
    }
    
    
    /**
     * @description 无参数的hql全部记录查询
     * @param hql hql语句
     * @return
     */
    public List findByHql(String hql){
        return findByHql(hql,null,0,0);
    }
    
    /**
     * @description 带有参数的hql全部记录查询
     * @param hql hql语