Fork me on GitHub

BaseDao 接口

// 以后所有的 Dao 接口都需要继承 BaseDao 接口;
// 自定义泛型接口

public interface BaseDao<T>{

    public void save(T t);

    public void delete(T t);

    public void update(T t);

    public T findById(Long id);

    public List<T> findAll();

    // 分页查询
public PageBean<T> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria);

}


// 以后所有的 XxxDaoImpl 都可以继承 BaseDaoImpl
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{

    // 定义成员属性,代表的是某个实体的类型
    private Class<T> entityClass;
    // 有参构造方法
    public BaseDaoImpl(Class<T> entityClass){
       this.entityClass = entityClass;
    }

    // 添加方法
    public void save(T t){
        this.getHibernateTemplate().save(t);
    }

    // 删除方法
    public void delete(T t){
        this.getHibernateTemplate().delete(t);
    }

    // 修改方法
    public void update(T t){
        this.getHibernateTemplate().update(t);
    }

    // 按主键查找
    public T findById(Long id){
        return (T)this.getHibernateTemplate().get(entityClass,id);
    }

    // 查询所有
    public List<T> findAll(){
        return (List<T>)this.getHibernateTemplate().find("from "+ entityClass.getSimpleName());
    }


// 分页查询
public PageBean<T> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria){

    // 创建分页对象
    PageBean<T> page = new PageBean<T>();
    // 给其各个属性赋值
    page.setPageCode(pageCode);
    page.setPageSize(pageSize);

    // 设置聚合函数, 此时,SQL 语句已经变成 select count(*) from
    criteria.setProjection(Projections.rowCount());
    List<Number> list = (List<Number>)this.getHibernateTemplate().fingByCriteria(criteria);
    if(list != null && list.size() > 0){
        int totalCount = list.get(0).intValue();
        // 设置总记录数
        page.setTotalCount(totalCount);
    }

    // 重置 SQL 语句, select * from
    criteria.setProjection(null);

    List<T> beanList = (List<T>)this.getHibernateTemplate().findByCriteria(
                        criteria,(pageCode - 1)*pageSize, pageSize    
                        );
    page.setBeanList(beanList);
    return page;
}

}


// 具体应用
// customer 的接口
public interface CustomerDao extends BaseDao<Customer>{   }

// customer 的实现类
public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao{

    // 解决按主键查找时, 需要 clazz 类的问题
    public CustomerDaoImpl(){
        // 调用父类的有参构造方法
        super(Customer.class);
    }
}

// 第二种解决 clazz 类的问题
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{

    // 定义成员属性
    private Class<T> clazz;

    // 当启动服务器时, applicationContext.xml 加载;
    // CustomerDaoImpl 类创建对象, 加载父类, 父类也创建
    // 父类中的空参构造方法执行
    public BaseDaoImpl(){
        // this 表示子类, c表示 CustomerDaoImpl 的 Class 对象
        // 1. 即得到当前运行类的 Class
        Class c = this.getClass();

        // 因为 CustomerDaoImpl extends BaseDaoImpl<Customer>
        // 2. 获取到运行类的 父类的参数化类型: BasDaoImpl<Customer>
        // type 是接口, java.lang.reflect.Type 包中
        Type type = c.getGenericSuperclass();

        // 3. 转换成子接口 ParameterizedType
        // java.lang.reflect.ParameterizedType;
        ParameterizedType ptype = (ParameterizedType) type;

        // 得到实际类型参数: <Customer> 里面的 Customer
        // 例如Map<key,value>, 返回的类型中可能有多个值,所以类型为数组
        Type[] types = ptype.getActualTypeArguments();

        // type 接口的实现类是 Class
        // 赋值给成员属性
        this.clazz = (Class<T>)types[0];
    }

    // 按主键查找
    public T findById(Long id){
        return (T)this.getHibernateTemplate().get(clazz,id);
    }

    // 查询所有
    public List<T> findAll(){
        // 使用 Class 里面getSimpleName(), 得到类名称
        // 注意: from 后面需要加空格
        return (List<T>)this.getHibernateTemplate().find("from "+ clazz.getSimpleName());
    }
}

posted @ 2017-10-27 11:21  小a的软件思考  阅读(1071)  评论(0编辑  收藏  举报