`

一个Hibernate Dao的模板

 
阅读更多
Model:
package com.pandy.model;


import com.pandy.common.BaseObject;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

@Entity
@Table(name = "rh_sys_user")
@NamedQueries(
        value = {
                @NamedQuery(name = "getAllByNamedQuery1", query = "from RhSysUser"),
                @NamedQuery(name = "getAllByNamedQuery2", query = "from RhSysUser")
        }

)
public class RhSysUser extends BaseObject implements Serializable {
    private static final long serialVersionUID = 9812345L;
    private Long userId;
    private String code;
    private String loginName;
    private String userName;
    //......

    @Id
    @Column(name = "user_id", unique = true, nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getUserId() {
        return this.userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    @Column(name = "code", length = 50)
    public String getCode() {
        return this.code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    //......
}





公共接口:
package com.pandy.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface BaseDAO <T, PK extends Serializable>{
    public void setSessionFactoryOverride(SessionFactory sessionFactory);
    public Session getSession();

    T get(PK id);
    boolean exists(PK id);
    T save(T object);
    void remove(T object);
    void remove(PK id);
    void delete(T object);
    public int delete(Map<String,Object> map);


    List<T> getAll();
    public List<T> getAll(List<Order> orderList);
    List<T> searchByField(String field,Object value, String orderField) throws RuntimeException;
    List<T> searchByFields(Map fields) throws RuntimeException;
    List<T> searchByFields(Map fields,Map<String,String> order) throws RuntimeException;
    T searchFirstByFields(Map fields) throws RuntimeException;
    T getFirstByCode(String code);
    List<T> findByNamedQuery(String queryName, Map<String, Object> queryParams);
    T findFirstByNamedQuery(String queryName, Map<String, Object> queryParams);
}



公共实现:
package com.pandy.dao.impl;

import com.pandy.dao.BaseDAO;
import org.hibernate.*;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;

import javax.annotation.Resource;
import javax.persistence.EntityManagerFactory;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BaseDAOImpl<T, PK extends Serializable> extends HibernateDaoSupport implements BaseDAO<T, PK> {
    protected EntityManagerFactory entityManagerFactory;
    private Class<T> persistentClass;
    @Resource
    private SessionFactory sessionFactory;

    public BaseDAOImpl(final Class<T> persistentClass) {
        this.persistentClass = persistentClass;
    }

    public BaseDAOImpl(final Class<T> persistentClass, SessionFactory sessionFactory) {
        this.persistentClass = persistentClass;
        this.sessionFactory = sessionFactory;
    }

    @Autowired
    public void setSessionFactoryOverride(SessionFactory sessionFactory) {
        super.setSessionFactory(sessionFactory);
        this.sessionFactory=sessionFactory;
    }
    public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
        this.entityManagerFactory = entityManagerFactory;
    }

    public Session getSession() throws HibernateException {
        Session sess = getSessionFactory().getCurrentSession();
        if (sess == null) {
            sess = getSessionFactory().openSession();
        }
        return sess;
    }

    @SuppressWarnings("unchecked")
    public List<T> getAll() {
        Session sess = getSession();
        return sess.createCriteria(persistentClass).list();
    }

    public List<T> getAll(List<Order> orderList) {
        Session sess = getSession();
        Criteria criteria = sess.createCriteria(persistentClass);
        criteria.setCacheable(true);
        if (orderList != null) {
            for (Order order : orderList) {
                criteria.addOrder(order);
            }
        }
        return criteria.list();
    }

    public List<T> searchByField(String field, Object value, String orderField) throws RuntimeException {
        Session sess = getSession();
        Criteria criteria = sess.createCriteria(persistentClass);
        criteria.setCacheable(true);

        if (field != null && field.trim().length() > 0) {
            criteria.add(Restrictions.eq(field, value));
        }

        if (orderField != null && orderField.trim().length() > 0) {
            criteria.addOrder(Order.asc(orderField));
        }

        return criteria.list();
    }


    public List<T> searchByFields(Map fields) throws RuntimeException {
        Session sess = getSession();
        Criteria criteria = sess.createCriteria(persistentClass);
        criteria.setCacheable(true);

        for (Object field : fields.keySet()) {
            String fieldName = field != null ? field.toString() : "";

            if (!fieldName.equals("")) {
                Object fieldValue = fields.get(field);
                criteria.add(Restrictions.eq(fieldName, fieldValue));

                if (fieldName.equals("orderField")) {
                    criteria.addOrder(Order.asc(fieldValue.toString()));
                }

            }


        }

        return criteria.list();

    }

    @Override
    public T getFirstByCode(String code) {
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("code", code);
        return searchFirstByFields(param);
    }

    @Override
    public T searchFirstByFields(Map fields) throws RuntimeException {
        List<T> list = searchByFields(fields);
        if (list != null && list.size() > 0) return list.get(0);
        return null;
    }

    @SuppressWarnings("unchecked")
    public T get(PK id) {
        Session sess = getSession();
        IdentifierLoadAccess byId = sess.byId(persistentClass);
        T entity = (T) byId.load(id);

        if (entity == null) {
            throw new ObjectRetrievalFailureException(this.persistentClass, id);
        }

        return entity;
    }

    @SuppressWarnings("unchecked")
    public boolean exists(PK id) {
        Session sess = getSession();
        IdentifierLoadAccess byId = sess.byId(persistentClass);
        T entity = (T) byId.load(id);
        return entity != null;
    }

    @SuppressWarnings("unchecked")
    public T save(T object) {
        Session sess = getSession();
        return (T) sess.merge(object);
    }

    public void remove(T object) {
        Session sess = getSession();
        sess.delete(object);
    }

    public void remove(PK id) {
        Session sess = getSession();
        IdentifierLoadAccess byId = sess.byId(persistentClass);
        T entity = (T) byId.load(id);
        sess.delete(entity);
    }

    @SuppressWarnings("unchecked")
    public List<T> findByNamedQuery(String queryName, Map<String, Object> queryParams) {
        Session sess = getSession();
        Query namedQuery = sess.getNamedQuery(queryName);
        namedQuery.setCacheable(true);
        for (String s : queryParams.keySet()) {
            namedQuery.setParameter(s, queryParams.get(s));
        }

        return namedQuery.list();
    }

    @SuppressWarnings("unchecked")
    public T findFirstByNamedQuery(String queryName, Map<String, Object> queryParams) {
        List<T> list = findByNamedQuery(queryName, queryParams);
        if (list != null && list.size() > 0)
            return list.get(0);
        return null;
    }

    @Override
    public void delete(T object) {
        getSession().delete(object);
    }

    @Override
    public int delete(Map<String, Object> map) {
        // TODO Auto-generated method stub
        if (map == null || map.size() == 0) {
            throw new RuntimeException("参数map不能为空或者size=0");
        }

        String className = this.persistentClass.getName();
        String name = className.substring(className.lastIndexOf(".") + 1);
        //System.out.println(name);
        String hql = "delete from " + name + " a where 1=1 ";

        for (String key : map.keySet()) {
            hql += " and a." + key + "=:" + key.replace(".", "_");
        }
        Query query = getSession().createQuery(hql);
        for (String key : map.keySet()) {
            //TODO: add by Pandy: 这里可能会有问题,比如int的类型经过instanceof会是Integer么?
            Object value = map.get(key);
            key = key.replace(".", "_");
            if (value instanceof Integer) {
                query.setInteger(key, (Integer) value);
            } else if (value instanceof Double) {
                query.setDouble(key, (Double) value);
            } else if (value instanceof Boolean) {
                query.setBoolean(key, (Boolean) value);
            } else if (value instanceof Date) {
                query.setDate(key, (Date) value);
            } else if (value instanceof Long) {
                query.setLong(key, (Long) value);
            } else {
                query.setString(key, value.toString());
            }


        }

        return query.executeUpdate();

    }


    @SuppressWarnings({"rawtypes", "unchecked"})
    @Override
    public List<T> searchByFields(Map fields, Map<String, String> orders) throws RuntimeException {
        Session sess = getSession();
        Criteria criteria = sess.createCriteria(persistentClass);
        criteria.setCacheable(true);

        for (Object field : fields.keySet()) {
            String fieldName = field != null ? field.toString() : "";

            if (!fieldName.equals("")) {
                Object fieldValue = fields.get(field);
                criteria.add(Restrictions.eq(fieldName, fieldValue));
            }
        }

        for (String field : orders.keySet()) {
            String order = orders.get(field);
            if ("desc".equalsIgnoreCase(order)) {
                criteria.addOrder(Order.desc(field));
            } else {
                criteria.addOrder(Order.asc(field));
            }

        }

        return criteria.list();
    }
}



使用接口定义:
package com.pandy.dao;

import com.pandy.model.RhSysUser;

public interface RhSysUserDao extends BaseDAO<RhSysUser, Integer> {
    public void test();
}



最终使用实现:

package com.pandy.dao.impl;

import com.pandy.dao.RhSysUserDao;
import com.pandy.model.RhSysUser;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.List;
@Repository(value="rhSysUserDao")
public class RhSysUserDaoImpl extends BaseDAOImpl<RhSysUser, Integer> implements RhSysUserDao{

    public RhSysUserDaoImpl() {
        super(RhSysUser.class);
    }

    @Override
    public void test() {
        Session session = getSessionFactory().getCurrentSession();
        Query query = session.createQuery("from RhSysUser");
        List<RhSysUser> list = query.list();
        if(list!=null && list.size()>0){
            for(RhSysUser rhSysUser :list){
                System.out.println(rhSysUser.getUserName());
            }
        }
    }
}
分享到:
评论

相关推荐

    springMVC + Hibernate 工程模板

    hibernate dao 操作(一个basedao全部搞定) 两种配置:oracle mysql,切换数据库只要把SessionFactory的配置文件改成对应就可以了 c3p0配置:mysql调试通过,oracle由于存在问题,未配置 spring配置式事务管理...

    Hibernate泛型DAO(结合spring模板支持)

    NULL 博文链接:https://zhaoshijie.iteye.com/blog/982232

    使用Struts + DAO + Hibernate完成用户登陆

    实例,完整的一套简单的j2ee开发的模板

    vc生成hibernate的dao类

    根据自定义的模板生成java代码. (vc6.0下编译通过)

    BeetlSQL数据库访问框架是一个全功能 DAO 工具,同时具有 Hibernate.rar

    BeetSql是一个全功能DAO工具,同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应用。 在开发效率上,无需注解,自动使用大量内置SQL,轻易完成增删...

    自动生成DAO源代码

    利用eclipse的JET模板自动生成java文件来生成DAO,生成的DAO继承了一个通用的GenenicDao,GenenicDao用到了spring和hibernate. 提供源代码

    struts2+spring+hibernate整合示例

    b 编写实体类,加入hibernate注解,编写方法类测试类,在applicationContext.xml中添加hibernate模板类配置以及包扫描语句 。在类中添加spring bean注解。 c 测试类中 主动解析applicationContext.xml ,获取bean ...

    java服务端后台常用模板(Spring Data JPA、Hibernate、 Spring MVC、Layer)

    一个用java相关技术搭建的后台服务端模板,目前仅仅包括基础模块和权限模块,用户可以结合自身业务进行相应扩展。 技术选型:Spring Data JPA、Hibernate、 Spring MVC、Layer等。 项目结构: tianti-common:...

    第24次课-1 Spring与Hibernate的整合

    HibernateCallback是一个接口,位于org.springframework.orm.hibernate3中。 该接口中只有一个方法doInHibernate(Session session)。 通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的...

    myeclipse_templates 模板

    MyEclipse的Hibernate配置的模板。 可以自定义反向工程策略,中的实体类,dao,和hbm文件

    SpringBoot使用Spring-data-jpa简化数据访问层

    为了解决抽象各个Java实体基本的“增删改查”操作,我们通常会以泛型的方式封装一个模板Dao来进行抽象简化,但是这样依然不是很方便,我们需要针对每个实体编写一个继承自泛型模板Dao的接口,再编写该接口的实现。...

    ssh2(struts2+spring2.5+hibernate3.3)自动生成模版

    作为一个软件公司,开发团队非常重要,作为一个开发团队,人员配备、开发效率等都非常重要,但是开发效率包含很多,如:代码质量(扩展性、重构性等),但是这些都是建立在规范的代码之上来进行,在一个团队中,每个开发者都有...

    J2EE三大框架_笔记_a

    16-留言管理程序_使用Struts + DAO + Hibernate完成笔记 17-Hibernate实体映射笔记 18-Hibernate复合主键笔记 20-22Hibernate_容器映射技术笔记 23-26Hibernate数据关联技术笔记 27-32Hibernate数据关联技术_1vs1...

    javaEE框架笔记,识货人下

    16-留言管理程序_使用Struts + DAO + Hibernate完成笔记.pdf 17-Hibernate实体映射笔记.pdf 18-Hibernate复合主键笔记.pdf 19-Hibernate实体层设计笔记.pdf 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记.pdf 20-22...

    ssh(structs,spring,hibernate)框架中的上传下载

     第3~9行定义了一个数据源,其实现类是apache的BasicDataSource,第11~25行定义了Hibernate的会话工厂,会话工厂类用Spring提供的LocalSessionFactoryBean维护,它注入了数据源和资源映射文件,此外还通过一些键值...

    J2EE框架_笔记_c

    16-留言管理程序_使用Struts + DAO + Hibernate完成笔记 17-Hibernate实体映射笔记 18-Hibernate复合主键笔记 20-22Hibernate_容器映射技术笔记 23-26Hibernate数据关联技术笔记 27-32Hibernate数据关联技术_1vs1...

    J2EE框架_笔记_b

    16-留言管理程序_使用Struts + DAO + Hibernate完成笔记 17-Hibernate实体映射笔记 18-Hibernate复合主键笔记 20-22Hibernate_容器映射技术笔记 23-26Hibernate数据关联技术笔记 27-32Hibernate数据关联技术_1vs1...

    spring-jpa-wicket-bootstrap:使用 Spring、JPA、Hibernate、Wicket 和 Bootstrap 的 J2EE Web 模板。 在 Tomcat 和 Postgres DB 上测试

    这是一个工作模板项目,它展示了一个示例多层 J2EE Web 应用程序,其中包含Apache Wicket 、 Spring IoC 、 JPA/Hibernate集成和基于Bootstrap的前端。 它演示了MvC 、 SoC 、 IoC 、 DAO 、 Service layer和Open ...

    一个最简单的SSH框架

    一个最简单的SSH框架Struts 、 spring 、 Hibernate 在各层的作用 1 ) struts 负责 web 层 . ActionFormBean 接收网页中表单提交的数据,然后通过 Action 进行处理,再 Forward 到对应的网页。 在 struts-config...

    HouseRent_https345daocom_租房系统、软件模板、代码_源码

    租房系统软件,比较老的技术,采用jsp和struts2和hibernate技术

Global site tag (gtag.js) - Google Analytics