zoukankan      html  css  js  c++  java
  • 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());
        }
    }
    

  • 相关阅读:
    Chapter 14_2 全局变量声明
    chapter 14_1 环境
    chapter 13_4 跟踪table的访问
    Linq to Entity 和 Linq to Object 异同
    ADO.net实体类操作
    XML
    JavaScript
    CSS样式表
    HTML
    java 反射
  • 原文地址:https://www.cnblogs.com/linkworld/p/7742281.html
Copyright © 2011-2022 走看看