`
mxl86
  • 浏览: 175452 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

奋斗两天,终于开发了自己的DAO层公共类(Spring+Hibernate实现)

阅读更多

此EntityDao接口与EntityDaoImpl实现类,可取代了我们平时写的UserDao,NewsDao,CompanyDao等等,可直接供Service层调用.其中实现类的代码如下:

/**
 * Copyright 2009-1012 the original author or authors.
 * My Blog site: http://www.blogjava.net/rongxh7
 */

package rong.common.dao;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.stereotype.Repository;
import rong.common.utils.Pager;
import rong.util.MyHibernateDaoSupport;

/** *//**
 * Dao层接口的实现类
 * 许多人习惯根据不多的业务逻辑定义不同的DAO层接口,如UserDao,NewsDao,CompanyDao等等,
 * 这样往往使得编码量十分庞大,而且带来了维护的困难,因此,抽取此DAO层接口,收录大部分
 * DAO层必须的方法,以供Service层调用。
 * @author rongxinhua
 * @version 1.0
 * @param <T> 范型,指实体类
 * @param <PK> 范型,指实体类主键的数据类型,如Integer,Long
 * @see rong.common.dao.EntityDao
 */

@Repository(value="entityDao")
public class EntityDaoImpl<T,PK extends Serializable> extends MyHibernateDaoSupport implements EntityDao<T, PK>{

    /** *//**
     * 保存实体
     * 包括添加和修改
     * @param t 实体对象
     */
    public void saveOrUpdate(T t){
        getHibernateTemplate().saveOrUpdate(t);
    }
    
    /** *//**
     * 更新实体
     * 可用于添加、修改、删除操作
     * @param hql 更新的HQL语句
     * @param params 参数,可有项目或多项目,代替Hql中的"?"号
     */
    public void update(final String hql,final Object params){
        getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Query query = session.createQuery(hql);
                for(int i=0; i<params.length; i++){
                    query.setParameter(i, params[i]);
                }
                query.executeUpdate();
                return null;
            }
        });
    }
    
    /** *//**
     * 删除实体
     * @param t 实体对象
     */
    public void delete(T t){
        getHibernateTemplate().delete(t);
    }
    
    /** *//**
     * 删除实体
     * @param entityClass 实体类名
     * @param id 实体的ID
     */
    public void delete(Class<T> entityClass,PK id){
        getHibernateTemplate().delete(get(entityClass,id));
    }
    
    /** *//**
     * 单查实体
     * @param entityClass 实体类名
     * @param id 实体的ID
     * @return 实体对象
     */
    @SuppressWarnings("unchecked")
    public T get(Class<T> entityClass,PK id){
        return (T)getHibernateTemplate().get(entityClass, id);
    }
    
    /** *//**
     * 查询全部记录列表
     * @param entityClass 实体类名
     * @param propertyName 排序的参照属性
     * @param isAsc 排序方式
     * @param criterions 查询条件,可为0项或任意多项目
     * @return 记录List集
     */
    public List<T> findAll(final Class<T> entityClass,final String propertyName,final boolean isAsc,final Criterion criterions){
        int firstResult = 0;
        int maxResults = 0;        //设置为0,则表示查询全部记录
        return findByCriteria(entityClass, propertyName, isAsc, firstResult, maxResults, criterions);
    }
    
    /** *//**
     * 查询列表
     * @param entityClass 实体类名
     * @param propertyName 排序的参照属性
     * @param isAsc 排序方式,true表示升序,false表示降序,当propertyName赋值为null时,此参数无效
     * @param firstResult 开始记录序号
     * @param maxResults 最大记录数
     * @param criterions 查询条件,可有0项或任意多项目
     * @return 记录List集
     */
    @SuppressWarnings("unchecked")
    public List<T> findByCriteria(final Class<T> entityClass,final String propertyName,final boolean isAsc,final int firstResult,final int maxResults,final Criterion criterions){
        List<T> list = (List<T>)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Criteria criteria = session.createCriteria(entityClass);
                //按属性条件查询
                for(Criterion criterion : criterions){
                    criteria.add(criterion);
                }
                //按某个属性排序
                if(null != propertyName){
                    if(isAsc){
                        criteria.addOrder(Order.asc(propertyName));
                    }else{
                        criteria.addOrder(Order.desc(propertyName));
                    }
                }
                //用于分页查询
                if(maxResults != 0){
                    criteria.setFirstResult(firstResult);
                    criteria.setMaxResults(maxResults);
                }
                List<T> list = criteria.list();
                return list;
            }
        });
        return list;
    }
    
    /** *//**
     * 查询总记录数
     * @param entityClass 实体类名
     * @param criterions 查询条件,可有0项或任意多项
     * @return 总记录数
     */
    public int findCountsByCriteria(final Class<T> entityClass,final Criterion criterions){
            int totalCounts = (Integer)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Criteria criteria = session.createCriteria(entityClass);
                //按属性条件查询
                for(Criterion criterion : criterions){
                    criteria.add(criterion);
                }
                int totalCounts = criteria.list().size();
                return totalCounts;
            }
        });
        return totalCounts;
    }
    
    
    /** *//**
     * 分页查询
     * @param entityClass 实体类名
     * @param propertyName 排序参照属性
     * @param isAsc 排序方式,true表示升序,false表示降序,当propertyName赋值为null时,此参数无效
     * @param firstResult 开始记录序号
     * @param maxResults 最大记录数
     * @param criterions 查询条件,可为0项或任意多项目
     * @return 封装List和totalCounts的Pager对象
     */
    @SuppressWarnings("unchecked")
    public Pager<T> findForPager(final Class<T> entityClass,final String propertyName,final boolean isAsc,final int firstResult,final int maxResults,final Criterion criterions){
        int totalCounts = findCountsByCriteria(entityClass, criterions);
        List<T> entityList = findByCriteria(entityClass, propertyName, isAsc, firstResult, maxResults, criterions);
        Pager pager = new Pager();
        pager.setTotalCounts(totalCounts);
        pager.setEntityList(entityList);
        return pager;
    }
    
    /** *//**
     * 根据属性值查询列表
     * @param entityClass 实体类名
     * @param propertyName 属性名
     * @param value 属性值
     * @return List列表
     */
    public List<T> findByProperty(Class<T> entityClass,String propertyName,Object value){
        Criterion criterion = Restrictions.eq(propertyName, value);
        List<T> list = findAll(entityClass, null, true, criterion);
        return list;
    }
    
    /** *//**
     * 根据属性值查询单个对象
     * @param entityClass 实体类名
     * @param propertyName 属性名
     * @param value 属性值
     * @return 实体对象
     */
    @SuppressWarnings("unchecked")
    public T findUniqueByProperty(final Class<T> entityClass,final String propertyName,final Object value){
        T t = (T)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Criteria criteria = session.createCriteria(entityClass).add(Restrictions.eq(propertyName, value));
                T t = (T)criteria.uniqueResult();
                return t;
            }
        });
        return t;
    }
    
    /** *//**
     * 根据属性值查询实体是否存在
     * @param entityClass 实体类名
     * @param propertyName 参照的属性名
     * @param value 属性值
     * @return 存在则返回true,不存在则返回false
     */
    public boolean isPropertyExist(final Class<T> entityClass,final String propertyName,final Object value){
        boolean isExist = (Boolean)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Criteria criteria = session.createCriteria(entityClass).add(Restrictions.eq(propertyName, value));
                boolean isEmpty = criteria.list().isEmpty();
                return ! isEmpty;
            }
        });
        return isExist;
    }
    
    /** *//**
     * 
     * @param hql 查询语句
     * 用法如:可用于登录验证时,根据用户名、密码等信息查询用户
     * @param params 参数数组,代替HQL中的"?"号,可有0项目或多项
     * @return 唯一实体,返回null则表示不存在配置的实体
     * @exception 如果查询的结果集不唯一,则抛异常
     */
    @SuppressWarnings("unchecked")
    public T findUniqueByHql(final String hql, final Object params ){
        
        T t = (T)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Query query = session.createQuery(hql);
                for(int i=0; i<params.length; i++){
                    query.setParameter(i, params[i]);
                }
                T t = (T)query.uniqueResult();
                return t;
            }
        });
        return t;
    }
    
    /** *//**
     * 按HQL条件查询列表
     * @param hql 查询语句,支持连接查询和多条件查询
     * @param params 参数数组,代替hql中的"?"号
     * @return 结果集List
     */
    @SuppressWarnings("unchecked")
    public List<T> findByHql(String hql,Object params){
        List list = getHibernateTemplate().find(hql, params);
        return list;
    }
    
    /** *//**
     * 按HQL分页查询
     * @param firstResult 开始记录号
     * @param maxResults 最大记录数
     * @param hql 查询语句,支持连接查询和多条件查询
     * @param params 参数数组,代替餐hql中的"?"号
     * @return 封装List和total的Pager对象
     */
    @SuppressWarnings("unchecked")
    public Pager<T> findForPagerByHql(final int firstResult, final int maxResults, final String hql, final Object params){
        Pager<T> pager = (Pager<T>)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Query query = session.createQuery(hql);
                for(int position = 0; position < params.length; position ++){
                    query.setParameter(position, params[position]);
                }
                int totalCounts = query.list().size();    //总记录数
                //用于分页查询
                if(maxResults > 0){
                    query.setFirstResult(firstResult);
                    query.setMaxResults(maxResults);
                }
                List<T> list = query.list();
                Pager<T> pager = new Pager<T>();
                pager.setEntityList(list);
                pager.setTotalCounts(totalCounts);
                return pager;
            }
        });
        return pager;
    } 
}

 

相关说明:MyHibernateDaoSupport类是我自定义的类,该类继承HibernateDaoSupport,相关代码,请参考我的基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发 (2) ,EntityDao接口与实现类EntityDao的方法声明一样,在此暂且不贴出来.而代码中用到的Pager类,是一个封装list<Entity>和totalCounts的POJO类,代码比较简单,在此也不贴出来.
      开发本代码之前,参考过以下资料:
1)Springside的源码
2)一位北京网友发给我的项目中的代码
        (*^-^*) 本文原创,转载请注明出处, http://www.blogjava.net/rongxh7谢谢! (*^-^*)

本文原创,转载请注明出处,谢谢!http://www.blogjava.net/rongxh7(心梦帆影JavaEE技术博客)

分享到:
评论
3 楼 mxl86 2009-11-25  
tag13346 写道
都抄成这样了还原创啊~呵呵

我那不是转载嘛,都是直接复制人家的,呵呵……
2 楼 tag13346 2009-11-23  
都抄成这样了还原创啊~呵呵
1 楼 zxsz4085 2009-09-05  
 

相关推荐

    springmvc+spring+hibernate

    7. **DAO和Service层**:创建DAO接口和实现类,利用Hibernate的Session进行数据库操作。同时,创建Service层接口和实现类,将业务逻辑封装起来,这些类通常会依赖于DAO层。 8. **Controller层**:创建Spring MVC的...

    Struts+Spring+Hibernate开发实例.pdf

    标题和描述中指出的文档《Struts+Spring+Hibernate开发实例.pdf》包含了关于这三个流行的Java开源框架结合使用的示例代码和相关知识点。Struts负责视图与控制器部分,Spring负责业务逻辑层及依赖注入,Hibernate负责...

    idea工具创建的Spring+SpringMVC+Hibernate+maven项目

    - `src/main/java`:存放Java源代码的地方,通常会看到Spring配置类、服务层接口和实现、DAO层接口和实现等。 - `src/main/resources`:存放配置文件的地方,比如Spring的XML配置、Hibernate的实体映射文件(hbm.xml...

    JSF+Spring+Hibernate小例子

    **JSF+Spring+Hibernate整合应用详解** 在Java Web开发中,JSF(JavaServer Faces)、Spring和Hibernate是三个常用的技术栈,它们分别负责视图层、业务逻辑层和服务数据持久化层。这个"JSF+Spring+Hibernate小例子...

    Spring+Hibernate实现用户登录

    本项目"Spring+Hibernate实现用户登录"旨在演示如何整合这两个框架,构建一个能够处理用户登录功能的Web应用程序。下面将详细介绍这个项目涉及的关键知识点。 1. **Spring框架**:Spring是一个全面的Java应用开发...

    webwork+spring+hibernate 开发资料

    在提供的文档“webwork+spring+hibernate架构.doc”中,可能详细阐述了这三者如何协同工作,包括配置文件设置、依赖注入的使用、事务管理策略以及具体实例的开发步骤。而“webwork.doc”则可能专门介绍了WebWork框架...

    用Maven搭建Spring+Spring MVC+Hibernate框架

    对于Spring+Spring MVC+Hibernate的项目,你需要引入以下关键依赖: 1. Spring的核心库,提供依赖注入和AOP支持。 2. Spring MVC,用于处理HTTP请求和响应,实现Web应用的前端控制器。 3. Hibernate,作为ORM框架,...

    使用Struts + Spring + Hibernate完成用户登陆笔记

    * 使用Spring框架来实现依赖注入和AOP,例如使用Spring的HibernateDaoSupport来实现DAO层的开发。 六、系统优点 * 使用Struts、Spring和Hibernate三种技术可以实现一个灵活、可维护和高效的用户登陆系统。 * 系统...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    13.7.10 调查结果DAO实现类SurveyChildCountDAOImpl.java 13.8 编写网上调查系统的业务逻辑类 13.8.1 注册接口Regedit.java 13.8.2 登录接口Login.java 13.8.3 设定调查题目接口SetSurvey.java 13.8.4 设定调查项目...

    struts+spring+hibernate三大框架整合

    SSH三大框架,即Struts、Spring和Hibernate,是Java Web开发中的常用技术组合,它们各自负责不同的职责:Struts作为MVC模式中的Controller层,处理用户请求并转发到相应的业务逻辑;Spring则作为核心容器,负责依赖...

    Flex+spring+hibernate示例

    Flex+Spring+Hibernate示例是一种常见的企业级应用架构,它结合了Adobe Flex前端技术、Spring后端框架和Hibernate持久层框架,以构建高效、灵活且易于维护的Web应用程序。在这个示例中,开发者可能已经展示了如何...

    Spring+Spring mvc+Hibernate+Bootstrap、企业级员工信息管理系统

    01. 采用后台及前台的 Spring + Spring mvc + Hibernate + Bootstrap 02. 后台全注解式的开发(除了必要的spring和hibernate的xml配置以外) 03. 后台通过自定义注解结合一个访问拦截器实现整个系统的权限控制 04...

    jsf+spring+hibernate

    【JSF+Spring+Hibernate整合开发】 JSF (JavaServer Faces)、Spring 和 Hibernate 是 Java 开发中的三大核心技术,常用于构建企业级的 Web 应用程序。它们各自扮演着不同的角色,共同构建了一个强大的后端架构。 1...

    spring+hibernate整合实现简单数据库添加记录

    总之,Spring+Hibernate的整合为Java开发者提供了一种高效且灵活的方式来处理数据库操作。通过理解这两个框架的核心原理以及整合过程,初学者能够更好地掌握企业级应用开发的技巧。实践这些步骤,不仅可以帮助你实现...

    struts+spring+hibernate开发 注册小实例

    Struts、Spring 和 Hibernate 是Java Web开发中的三大框架,它们的组合通常被称为SSH(Struts、Spring、Hibernate)。这个“struts+spring+hibernate开发 注册小实例”是为初学者设计的一个教程,目的是帮助他们快速...

    struts+spring+hibernate(mysql)用户登录及文件上传

    在这个项目中,"struts+spring+hibernate(mysql)用户登录及文件上传",开发者整合了这三个框架,并结合MySQL数据库实现了一个完整的用户管理系统,包括用户身份验证和文件上传功能。 首先,Struts是MVC(Model-View...

    Spring+Hibernate整合

    在开发过程中,子文件"SpringHibernateDemo"可能是一个包含整合示例代码的项目,其中包括Spring的配置文件、Hibernate的实体类、DAO层接口及其实现、服务层接口及其实现等。这些代码展示了如何在Spring环境中使用...

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...

    ssh(struts+spring+hibernate)教务管理信息系统(全部代码) 可以直接运行

    SSH(Struts+Spring+Hibernate)是一个经典的Java Web开发框架,用于构建高效、可扩展的企业级应用程序。这个教务管理信息系统是基于SSH框架实现的,提供了完整的源代码,可以直接运行,便于开发者学习和参考。 **...

    java web 实战宝典_JSP+Servlet+Struts_2+Hibernate+Spring+Ajax

    综合以上所述,这本“java web 实战宝典_JSP+Servlet+Struts_2+Hibernate+Spring+Ajax”涵盖了JSP和Servlet作为Web基础技术的知识,以及Struts 2、Spring、Hibernate三个主流的SSH框架,并且提供了Ajax技术的应用...

Global site tag (gtag.js) - Google Analytics