`
jiayj198609
  • 浏览: 149799 次
  • 性别: 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(); } }); } }

分享到:
评论

相关推荐

    Struts2 Spring3 Hibernate 注解功能 DAO 泛型 通用分页

    总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...

    ssh整合下的通用泛型DAO+分页

    在这个特定的讨论中,我们聚焦于SSH1中的一个关键概念:通用泛型DAO(Data Access Object)以及分页功能的实现。DAO层是模型层和数据访问层之间的桥梁,它的主要职责是处理数据库操作,为业务层提供无状态的数据访问...

    SSH 泛型DAO分页

    这个压缩包文件的标题"SSH 泛型DAO分页"表明它提供了一个实现SSH框架整合的示例,特别关注了泛型DAO(Data Access Object)以及分页功能。下面将详细介绍SSH框架及其分页和泛型DAO的概念。 1. **Struts2**: Struts2...

    ssh通用泛型DAO

    在Java开发领域,SSH(Struts2、Spring、Hibernate)是一个经典的MVC框架组合,用于构建企业级Web应用。SSH中的DAO(Data Access Object)层是数据访问层,负责与数据库进行交互。在这个主题中,我们将深入探讨"ssh...

    struts+spring+hibernate通用分页方法

    在文档"struts+spring+hibernate通用分页方法.doc"中,可能会详细阐述如何配置这些框架的整合,如何编写Action、Service、DAO以及视图层的代码,以及如何测试和优化分页性能,例如缓存策略、预加载等。 这个通用...

    SSH泛型DAO+Proxool+DisPlayTag+Jquery easyui

    标题中的"SSH泛型DAO+Proxool+DisPlayTag+Jquery easyui"涉及到的是一个基于Spring、Struts和Hibernate(SSH)框架的Web应用开发中的几个关键技术和组件。让我们逐一深入探讨这些技术。 1. **Spring**: Spring 是...

    使用配置文件对DAO层封装具有分页功能的S2SH整合实例_好资源0分送

    本文档旨在详细介绍如何使用配置文件的方式完成DAO层的封装,并在此基础上实现分页功能,最终达成S2SH(Struts、Spring、Hibernate)的整合。此文档作为对《使用Annotation并对DAO层封装具有分页功能的S2SH整合实例...

    JavaEE8500offer模板包含详细说明和定义

    1. **福建羽晨服饰绩效管理二次开发** - 使用了J2EE技术框架,包括Struts2、Spring、Hibernate和WebLogic。Struts2作为控制层,Spring处理业务逻辑,Hibernate负责数据持久化,WebLogic作为中间件。此外,还运用了...

    java开发程序员简历

    * 使用 Hibernate 实现持久化层,使用泛型 DAO 封装添/删/改/查/分页/统计这些操作 * 实现细粒度权限管理使用 Struts2 中提供的拦截器实现对 Action 方法的拦截 * 粗粒度权限管理使用 Filter 实现 * 使用 Java、...

    JSP,SSH框架学习日志3,DAO层.pdf

    在Java Web开发中,SSH(Struts2、Spring、Hibernate)框架被广泛使用,而DAO(Data Access Object)层是SSH架构中的一个重要组成部分,主要负责与数据库进行交互。本篇日志将探讨如何在SSH框架下高效地实现DAO层,...

    如何对多对多关系获得的set集合中的记录进行分页

    在Java Web开发中,SSH(Struts2、Spring、Hibernate)框架被广泛使用,其中的分页功能是提高用户体验的重要一环。对于处理多对多关系的数据,分页显得更为复杂,因为涉及到的对象关联和集合的处理。本篇将详细阐述...

    ssh数据库基本操作封装

    SSH(Struts + Spring + Hibernate)是一个经典的Java Web开发框架,用于构建企业级应用程序。在这个主题中,“ssh数据库基本操作封装”指的是将常用的数据库交互功能,如增删改查(CRUD),通过SSH框架进行封装,...

    java程序员面试简历&#40;列子&#41;.doc.doc

    - DaoSupport用于通用的DAO操作,封装分页功能,并使用自定义泛型。 - 文件上传下载通过IO和特定库如JSPSmartUpload、Spring的POI实现。 这份简历展示了应聘者扎实的Java Web开发基础,丰富的框架使用经验以及...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

Global site tag (gtag.js) - Google Analytics