`
jiayj198609
  • 浏览: 146966 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Struts2、Hibernate、Spring整合的泛型DAO,以及通用的分页技术 一

阅读更多
1.基本DAO泛型接口


view plaincopy to clipboardprint?

package abu.csdn.dao;   
import java.io.Serializable;   
import java.util.Collection;   
import java.util.List;   
/**
* <p/>
* 使用泛型作为DAO的通用接口 这里没有提供按名称精确查找,和模糊查找 上述两个方法应该由各自的具体接口去定义
* <p/>
*
* @author Abu
* @param <T> :
* 持久化的实体Bean
* @param <ID> :
* 实体Bean的id
*/  
public interface GenericDao<T, ID extends Serializable> {   
    /**
      * 保存实体
      *
      * @param entity :
      *                实体
      * @return 保存后得到的id
      */  
    public ID save(T entity);   
    /**
      * 在查找所有记录的时候,使用提供查询语句,查询匹配的记录,否则将使用默认的查询语句查询数据的所有记录.
      *
      * @param hql : 自定义的HQL语句
      */  
    public void setHql(String hql);   
    /**
      *
      * @return 自定义的HQL语句
      */  
    public String getHql();   
    /**
      * <p>
      * 删除实体
      * </p>
      *
      * @param entity :
      *                实体
      */  
    public void remove(T entity);   
    /**
      * <p>
      * 删除实体集合
      * </p>
      *
      * @param entities :
      *                  实体
      */  
    public void removeAll(Collection<T> entities);   
    /**
      * <p>
      * 修改实体
      * </p>
      *
      * @param entity :
      *                实体
      */  
    public void modify(T entity);   
    /**
      * <p>
      * 通过名字查找
      * </p>
      *
      * @param id :
      *            id
      * @return 找到的实体
      */  
    public T findById(ID id);   
    /**
      * <p/>
      * 查找全部实体
      * <p/>
      *
      * @return 所有实体的列表
      */  
    public List<T> findAll();   
    /**
      * <p>
      * 计算匹配查询条件的记录总数,如果没有注入或者设置hql语句,将使用默认的查询语句返回数据库中所有记录
      * </p>
      *
      * @return 记录总数
      */  
    public int getTotalRows();   
    /**
      * <p>
      * 根据每页记录的数量,计算出总的分页数
      * </p>
      *
      * @param size 每页记录的数量
      * @return 分页总数
      */  
    public int getPageSize(int size);   
    /**
      * <p/>
      * 根据给定的页码进行分页查找,这是纯Hibernate分页.
      * <p/>
      *
      * @param page : 要查询的页码
      *              查询的hql语句
      * @param size : 每页记录数
      *              分页信息,参见PageInfo
      * @return 匹配的实体列表
      */  
    public List<T> findByPage(final int page, final int size);   
}  
package abu.csdn.dao; import java.io.Serializable; import java.util.Collection; import java.util.List; /** * <p/> * 使用泛型作为DAO的通用接口 这里没有提供按名称精确查找,和模糊查找 上述两个方法应该由各自的具体接口去定义 * <p/> * * @author Abu * @param <T> : * 持久化的实体Bean * @param <ID> : * 实体Bean的id */ public interface GenericDao<T, ID extends Serializable> { /** * 保存实体 * * @param entity : * 实体 * @return 保存后得到的id */ public ID save(T entity); /** * 在查找所有记录的时候,使用提供查询语句,查询匹配的记录,否则将使用默认的查询语句查询数据的所有记录. * * @param hql : 自定义的HQL语句 */ public void setHql(String hql); /** * * @return 自定义的HQL语句 */ public String getHql(); /** * <p> * 删除实体 * </p> * * @param entity : * 实体 */ public void remove(T entity); /** * <p> * 删除实体集合 * </p> * * @param entities : * 实体 */ public void removeAll(Collection<T> entities); /** * <p> * 修改实体 * </p> * * @param entity : * 实体 */ public void modify(T entity); /** * <p> * 通过名字查找 * </p> * * @param id : * id * @return 找到的实体 */ public T findById(ID id); /** * <p/> * 查找全部实体 * <p/> * * @return 所有实体的列表 */ public List<T> findAll(); /** * <p> * 计算匹配查询条件的记录总数,如果没有注入或者设置hql语句,将使用默认的查询语句返回数据库中所有记录 * </p> * * @return 记录总数 */ public int getTotalRows(); /** * <p> * 根据每页记录的数量,计算出总的分页数 * </p> * * @param size 每页记录的数量 * @return 分页总数 */ public int getPageSize(int size); /** * <p/> * 根据给定的页码进行分页查找,这是纯Hibernate分页. * <p/> * * @param page : 要查询的页码 * 查询的hql语句 * @param size : 每页记录数 * 分页信息,参见PageInfo * @return 匹配的实体列表 */ public List<T> findByPage(final int page, final int size); }




2.基本DAO泛型接口的实现


view plaincopy to clipboardprint?

package abu.csdn.dao.impl;   
import java.io.Serializable;   
import java.sql.SQLException;   
import java.util.Collection;   
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.HibernateTemplate;   
import abu.csdn.dao.GenericDao;   
/**
*
* @author Abu
*
* @param <T>
* @param <ID>
*/  
public class GenericDaoImpl<T, ID extends Serializable> implements  
         GenericDao<T, ID> {   
    // 具体的实体类型   
    private Class<T> type;   
    // Spring提供的Hibernate工具类   
    private HibernateTemplate hibernateTemplate;   
    // 查询条件   
    private String hql;   
    /**
      * <p>
      * 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型
      * <p>
      *
      * @param type :
      *             实体类型
      */  
    public GenericDaoImpl(Class<T> type) {   
        this.type = type;   
        this.hql = "from " + type.getName();   
     }   
    /**
      * <p>
      * 因为这个类没有继承HibernateDaoSupport,所以现在由Spring注入HibernateTemplate
      * </p>
      *
      * @param hibernateTemplate :
      *             Spring提供的Hibernate工具类
      */  
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {   
        this.hibernateTemplate = hibernateTemplate;   
     }   
    public void setHql(String hql) {   
        this.hql = hql;   
     }   
    public HibernateTemplate getHibernateTemplate() {   
        return hibernateTemplate;   
     }   
    public String getHql() {   
        return hql;   
     }   
    @SuppressWarnings("unchecked")   
    public List<T> findAll() {   
         String hql = "from " + type.getName();   
        return (List<T>) hibernateTemplate.find(hql);   
     }   
       
    @SuppressWarnings("unchecked")   
    public T findById(ID id) {   
        return (T) hibernateTemplate.get(type, id);   
     }   
    public void modify(T entity) {   
         hibernateTemplate.update(entity);   
     }   
    public void remove(T entity) {   
         hibernateTemplate.delete(entity);   
     }   
       
    public void removeAll(Collection<T> entities) {   
         hibernateTemplate.deleteAll(entities);         
     }   
    @SuppressWarnings("unchecked")   
    public ID save(T entity) {   
        return (ID) hibernateTemplate.save(entity);   
     }   
    public int getTotalRows() {   
         String actualHql = "select count(*) "  
                 + hql.substring(hql.indexOf("from"));   
        return ((Long) this.hibernateTemplate.find(actualHql).get(0))   
                 .intValue();   
     }   
    public int getPageSize(int size) {   
        // 最大页数   
        int pageSize;   
        // 实际每页数据条数   
        int actualSize;   
        // 总记录数   
        int totalRows = this.getTotalRows();   
        // 计算实际每页的条数,如果请求的每页数据条数大于总条数, 则等于总条数   
         actualSize = (size > totalRows) ? totalRows : size;   
        if (totalRows > 0) {   
             pageSize = (totalRows % size == 0) ? (totalRows / actualSize)   
                     : (totalRows / actualSize + 1);   
         } else {   
             pageSize = 0;   
         }   
        return pageSize;   
     }   
    @SuppressWarnings("unchecked")   
    public List<T> findByPage(final int page, final int size) {   
        final int pageSize = this.getPageSize(size);   
        final int totalRows = this.getTotalRows();   
        return hibernateTemplate.executeFind(new HibernateCallback() {   
            public List<T> doInHibernate(Session session)   
                    throws HibernateException, SQLException {   
                // 实际页码   
                int actualPage = (page > pageSize) ? pageSize : page;   
                // 计算实际每页的条数,如果请求的每页数据条数大于总条数, 则等于总条数   
                int actualSize = (size > totalRows) ? totalRows : size;   
                // 计算请求页码的第一条记录的索引值,如果   
                int startRow = (actualPage > 0) ? (actualPage - 1) * actualSize   
                         : 0;   
                 Query query = session.createQuery(hql);   
                // 设置第一条记录   
                 query.setFirstResult(startRow);   
                 query.setMaxResults(actualSize);   
                return (List<T>) query.list();   
             }   
         });   
     }   
}  
package abu.csdn.dao.impl; import java.io.Serializable; import java.sql.SQLException; import java.util.Collection; 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.HibernateTemplate; import abu.csdn.dao.GenericDao; /** * * @author Abu * * @param <T> * @param <ID> */ public class GenericDaoImpl<T, ID extends Serializable> implements GenericDao<T, ID> { // 具体的实体类型 private Class<T> type; // Spring提供的Hibernate工具类 private HibernateTemplate hibernateTemplate; // 查询条件 private String hql; /** * <p> * 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型 * <p> * * @param type : * 实体类型 */ public GenericDaoImpl(Class<T> type) { this.type = type; this.hql = "from " + type.getName(); } /** * <p> * 因为这个类没有继承HibernateDaoSupport,所以现在由Spring注入HibernateTemplate * </p> * * @param hibernateTemplate : * Spring提供的Hibernate工具类 */ public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } public void setHql(String hql) { this.hql = hql; } public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } public String getHql() { return hql; } @SuppressWarnings("unchecked") public List<T> findAll() { String hql = "from " + type.getName(); return (List<T>) hibernateTemplate.find(hql); } @SuppressWarnings("unchecked") public T findById(ID id) { return (T) hibernateTemplate.get(type, id); } public void modify(T entity) { hibernateTemplate.update(entity); } public void remove(T entity) { hibernateTemplate.delete(entity); } public void removeAll(Collection<T> entities) { hibernateTemplate.deleteAll(entities); } @SuppressWarnings("unchecked") public ID save(T entity) { return (ID) hibernateTemplate.save(entity); } public int getTotalRows() { String actualHql = "select count(*) " + hql.substring(hql.indexOf("from")); return ((Long) this.hibernateTemplate.find(actualHql).get(0)) .intValue(); } public int getPageSize(int size) { // 最大页数 int pageSize; // 实际每页数据条数 int actualSize; // 总记录数 int totalRows = this.getTotalRows(); // 计算实际每页的条数,如果请求的每页数据条数大于总条数, 则等于总条数 actualSize = (size > totalRows) ? totalRows : size; if (totalRows > 0) { pageSize = (totalRows % size == 0) ? (totalRows / actualSize) : (totalRows / actualSize + 1); } else { pageSize = 0; } return pageSize; } @SuppressWarnings("unchecked") public List<T> findByPage(final int page, final int size) { final int pageSize = this.getPageSize(size); final int totalRows = this.getTotalRows(); return hibernateTemplate.executeFind(new HibernateCallback() { public List<T> doInHibernate(Session session) throws HibernateException, SQLException { // 实际页码 int actualPage = (page > pageSize) ? pageSize : page; // 计算实际每页的条数,如果请求的每页数据条数大于总条数, 则等于总条数 int actualSize = (size > totalRows) ? totalRows : size; // 计算请求页码的第一条记录的索引值,如果 int startRow = (actualPage > 0) ? (actualPage - 1) * actualSize : 0; Query query = session.createQuery(hql); // 设置第一条记录 query.setFirstResult(startRow); query.setMaxResults(actualSize); return (List<T>) query.list(); } }); } }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics