`
xiaozhiwz
  • 浏览: 16197 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

hibernate4的BaseDao实现

阅读更多

1.最近用到了hibernate持久层框架,于是写了个BaseDao模板类,除了基本的增删改查外,查询方法用到了hibernate完全面向对象的Criteria,这个基本撇开了HQL和SQL,操作也非常简单,废话不多说帖代码

 

BaseHibernateDao

package com.totoro.dao;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.util.Assert;

import com.totoro.util.ConditionQuery;
import com.totoro.util.OrderBy;
import com.totoro.util.Page;

public class BaseHibernateDao<T, PK extends java.io.Serializable> {

	// 日志输出类
	protected static final Logger LOGGER = LoggerFactory
			.getLogger(BaseHibernateDao.class);

	// 泛型反射类
	private Class<T> entityClass;

	// 通过反射获取子类确定的泛型类
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public BaseHibernateDao() {
		Type genType = getClass().getGenericSuperclass();
		Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
		entityClass = (Class) params[0];
	}

	/*
	 * 注入sessionFactory
	 */
	@Autowired
	@Qualifier("sessionFactory")
	private SessionFactory sessionFactory;

	public Session getSession() {
		// 事务必须是开启的(Required),否则获取不到
		return sessionFactory.getCurrentSession();
	}

	/*
	 * 保存PO
	 */
	@SuppressWarnings("unchecked")
	public PK save(T entity) {
		return (PK) getSession().save(entity);
	}

	/*
	 * 保存或更新PO
	 */
	public void saveOrUpdate(T entity) {
		getSession().saveOrUpdate(entity);
	}

	/*
	 * 更新PO
	 */
	public void update(T entity) {
		getSession().update(entity);

	}

	/*
	 * 合并PO
	 */
	public void merge(T entity) {
		getSession().merge(entity);
	}

	/*
	 * 根据id删除PO
	 */
	public void delete(PK id) {
		getSession().delete(this.get(id));

	}

	/*
	 * 删除PO
	 */
	public void deleteObject(T entity) {
		getSession().delete(entity);
	}

	/*
	 * 根据id判断PO是否存在
	 */
	public boolean exists(PK id) {
		return get(id) != null;
	}

	/*
	 * 根据id加载PO
	 */
	@SuppressWarnings("unchecked")
	public T load(PK id) {
		return (T) getSession().load(this.entityClass, id);
	}

	/*
	 * 根据id获取PO
	 */
	@SuppressWarnings("unchecked")
	public T get(PK id) {
		return (T) getSession().get(this.entityClass, id);
	}

	/*
	 * 获取PO总数(默认为entityClass)
	 */
	public int countAll() {
		Criteria criteria = createCriteria();
		return Integer.valueOf(criteria.setProjection(Projections.rowCount())
				.uniqueResult().toString());
	}

	/*
	 * 根据Criteria查询条件,获取PO总数
	 */
	public int countAll(Criteria criteria) {
		return Integer.valueOf(criteria.setProjection(Projections.rowCount())
				.uniqueResult().toString());
	}

	/*
	 * 删除所有
	 */
	public void deleteAll(Collection<?> entities) {
		if (entities == null)
			return;
		for (Object entity : entities) {
			getSession().delete(entity);
		}
	}

	/*
	 * 获取全部对象
	 */
	@SuppressWarnings("unchecked")
	public List<T> list() {
		return createCriteria().list();
	}

	/*
	 * 获取对象列表根据Criteria
	 */
	@SuppressWarnings("unchecked")
	public List<T> list(Criteria criteria) {
		return criteria.list();
	}

	/*
	 * 离线查询
	 */
	@SuppressWarnings({ "unchecked", "hiding" })
	public <T> List<T> list(DetachedCriteria criteria) {
		return (List<T>) list(criteria.getExecutableCriteria(getSession()));
	}

	/*
	 * 获取全部对象,支持排序
	 * 
	 * @param orderBy
	 * 
	 * @param isAsc
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<T> list(String orderBy, boolean isAsc) {
		Criteria criteria = createCriteria();
		if (isAsc) {
			criteria.addOrder(Order.asc(orderBy));
		} else {
			criteria.addOrder(Order.desc(orderBy));
		}
		return criteria.list();
	}

	/*
	 * 按属性查找对象列表,匹配方式为相等
	 * 
	 * @param propertyName
	 * 
	 * @param value
	 * 
	 * @return
	 */
	public List<T> list(String propertyName, Object value) {
		Criterion criterion = Restrictions
				.like(propertyName, "%" + value + "%");
		return list(criterion);
	}

	/*
	 * 根据查询条件获取数据列表
	 */
	@SuppressWarnings("unchecked")
	private List<T> list(Criterion criterion) {
		Criteria criteria = createCriteria();
		criteria.add(criterion);
		return criteria.list();
	}

	/*
	 * 按Criteria查询对象列表
	 * 
	 * @param criterions数量可变的Criterion
	 * 
	 * @param criterions
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<T> list(Criterion... criterions) {
		return createCriteria(criterions).list();
	}

	/*
	 * 按属性查找唯一对象,匹配方式为相等
	 * 
	 * @param propertyName
	 * 
	 * @param value
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T uniqueResult(String propertyName, Object value) {
		Criterion criterion = Restrictions.eq(propertyName, value);
		return (T) createCriteria(criterion).uniqueResult();
	}

	/*
	 * 按Criteria查询唯一对象
	 * 
	 * @param criterions数量可变的Criterion
	 * 
	 * @param criterions
	 * 
	 * @return
	 */
	public T uniqueResult(Criterion... criterions) {
		Criteria criteria = createCriteria(criterions);
		return uniqueResult(criteria);
	}

	/*
	 * 按Criteria查询唯一对象
	 * 
	 * @param criterions
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T uniqueResult(Criteria criteria) {
		return (T) criteria.uniqueResult();
	}

	/*
	 * 为Criteria添加distinct transformer
	 * 
	 * @param criteria
	 * 
	 * @return
	 */
	// 认为没用
	public Criteria distinct(Criteria criteria) {
		// 将结果集进行一次封装,封装成DISTINCT_ROOT_ENTITY对象,方便service层代码使用
		criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
		return criteria;
	}

	/*
	 * 强制清空session
	 */
	public void flush() {
		getSession().flush();
	}

	/*
	 * 清空session
	 */
	public void clear() {
		getSession().clear();
	}

	/*
	 * 创建Criteria实例
	 */
	public Criteria createCriteria() {
		return getSession().createCriteria(entityClass);
	}

	/*
	 * 根据Criterion条件创建Criteria
	 * 
	 * @param criterions数量可变的Criterion
	 */
	public Criteria createCriteria(Criterion... criterions) {
		Criteria criteria = createCriteria();
		for (Criterion c : criterions) {
			criteria.add(c);
		}
		return criteria;
	}

	/*
	 * 分页查询Criteria
	 * 
	 * @param
	 * 
	 * @return
	 */
	public List<T> findPage(Criteria criteria, int pageNo, int pageSize) {
		// 设置起始结果数
		criteria.setFirstResult((pageNo - 1) * pageSize);
		// 返回的最大结果集
		criteria.setMaxResults(pageSize);
		return list(criteria);
	}

	/*
	 * 分页查询Criteria
	 * 
	 * @param
	 * 
	 * @return
	 */
	public Page<T> pagedQuery(Criteria criteria, int pageNo, int pageSize) {
		Assert.isTrue(pageNo >= 1, "pageNO should start from 1");

		// 返回查询结果集
		List<T> list = findPage(criteria, pageNo, pageSize);
		/*
		 * 注:因为finaPage方法改变了查询条件导致countALL方法查询为空, 所以必须重新设置setFirstResult为0
		 */
		criteria.setFirstResult(0);
		// count查询
		// 获得查询总数
		long totalCount = countAll(criteria);

		if (totalCount < 1) {
			return new Page<T>();
		}

		// 实际查询返回分页对象
		int startIndex = Page.getStartOfPage(pageNo, pageSize);

		return new Page<T>(startIndex, totalCount, pageSize, list);
	}

	/*
	 * 分页查询Criteria
	 * 
	 * @param
	 * 
	 * @return
	 */
	public Page<T> pagedQuery(ConditionQuery conditionQuery, OrderBy orderBy,
			int pageNo, int pageSize) {
		Assert.isTrue(pageNo >= 1, "pageNO should start from 1");
		Criteria criteria = createCriteria();
		// 构造查询条件和排序
		conditionQuery.build(criteria);
		orderBy.build(criteria);
		// count查询
		// 获得查询总数
		long totalCount = countAll(criteria);

		if (totalCount < 1) {
			return new Page<T>();
		}

		// 实际查询返回分页对象
		int startIndex = Page.getStartOfPage(pageNo, pageSize);
		// 返回查询结果集
		List<T> list = findPage(criteria, pageSize, pageNo);

		return new Page<T>(startIndex, totalCount, pageSize, list);
	}

}

 

分享到:
评论
1 楼 hppryzzz 2015-12-28  
import com.totoro.util.ConditionQuery; 
import com.totoro.util.OrderBy; 
import com.totoro.util.Page;

这三个哪去了?

相关推荐

    基于hibernate的baseDao

    本压缩包提供的"baseDAO"文件,包含了一个详细注释的BaseDAO实现,旨在提供一种易于理解和使用的Hibernate基础操作模板。 1. **Hibernate框架简介** Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java...

    hibernate BASEDAO

    在Java的持久化框架Hibernate中,BaseDAO(Base Data Access Object)是一种常见的设计模式,用于封装数据库操作,提供一套标准的方法来实现CRUD(Create、Read、Update、Delete)操作。这种模式使得业务层可以更加...

    hibernate>>BaseDAO

    4. **HQL和SQL查询**:`BaseDAO`可能包含执行HQL(Hibernate Query Language)或原生SQL查询的方法。HQL是Hibernate提供的面向对象的查询语言,它可以更自然地表达面向对象的查询。而原生SQL查询则可以用于处理更...

    spring4+hibernate4 封装BaseDao增删改查以及分页,,支持jdk1.7,不支持jdk1.8

    本项目结合了Spring 4和Hibernate 4,旨在提供一个基础的数据访问层(DAO)实现,包括基本的CRUD操作(创建、读取、更新、删除)以及分页功能。以下是关于这个项目的详细知识点: 1. **Spring 4**:Spring框架是...

    Hibernate底层数据库操作函数BaseDao+具体实例

    在`BaseDao`的实现中,这些方法会利用Hibernate的Session和Transaction接口来完成实际的数据库交互。`Session`是Hibernate的主要工作单元,它可以代表一次数据库连接或者一个单位的工作。`Transaction`则用于管理...

    hibernate basedao(泛型版本)

    4. `BaseDao.java`和`BaseDaoInter.java`: 这两个文件可能包含了非泛型版本的基础DAO接口和实现,可能是为了兼容没有使用泛型的旧代码或者提供一个基础的非泛型实现,以便于开发者根据需求进行扩展。 总结来说,...

    spring和hibernate集成后,通用的basedao

    在这个名为"ssh"的压缩包中,很可能包含了一个关于Spring和Hibernate集成的示例代码,用于实现一个通用的基于DAO(Data Access Object)的设计模式。 Spring框架通过其IoC(Inversion of Control,控制反转)和AOP...

    ssh+baseDao实现分页

    本话题主要围绕如何利用SSH框架结合BaseDao实现分页功能来展开。 首先,让我们了解一下SSH框架的核心组件: 1. **Spring**:这是一个全面的开源应用框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能,使得...

    Spring整合hibernate(4)之BaseDao的编写示例

    Spring整合hibernate(4)之BaseDao的编写示例 说明:因为我们在实际编码中会编写一些重复的数据库操作方法CRUD,每个类都写一次感觉很繁琐,因此可以考虑考虑把所有公共的方法都写在BaseDao中,这个时候,让所有的...

    basedao_basedao数据库_

    例如,一个简单的基于JDBC的BaseDao实现可能如下: ```java public abstract class BaseDao&lt;T&gt; { private DataSource dataSource; public BaseDao(DataSource dataSource) { this.dataSource = dataSource; } ...

    spring mvc4 security3 hibernate4 kapctha实现的登录系统,比较粗糙。

    用spring4 mvc、spring security3、hibernate4、kapctha实现的用户登录系统。baseDao被放在了另外的项目中。因为对泛型不熟悉,多数方法放在Dao里面。简单说,很粗糙啦。

    Spring声明式事务及BaseDao完整版

    在IT行业中,Spring框架是Java开发中的核心工具之一,尤其在企业级应用中,它扮演着举足轻重的角色。...在实际项目中,开发者应根据需求选择合适的事务管理策略和BaseDao实现,以达到最佳的代码结构和性能。

    BaseDao的封装

    这些方法的实现可以使用模板方法设计模式,将一部分通用逻辑放在`BaseDao`中,而具体的SQL语句或者HQL(Hibernate Query Language)则由子类提供。 在实际项目中,`BaseDao`的实现往往需要结合事务管理。例如,当一...

    springboot2.0多数据源集成hibernate配置hibernateDaoSupport示例

    本示例主要介绍如何实现Spring Boot 2.0多数据源的集成,并结合Hibernate进行配置,特别是在DAO层使用`HibernateDaoSupport`进行操作,而非使用JPA(Java Persistence API)。 首先,让我们了解Spring Boot 2.0的...

    Spring MVC4+Hibernate4整合

    - **创建DAO层**:Spring MVC和Hibernate整合时,通常会创建一个通用的DAO接口,如`BaseDao`,并为每个数据库实体类创建对应的DAO实现类,如`UserDaoImpl`,利用Hibernate的Session进行数据库操作。 - **事务管理*...

    SSH集成查询分页处理BaseDao

    在标题提到的"SSH集成查询分页处理BaseDao"中,我们主要关注的是如何在SSH框架下实现数据的分页查询。 分页是大型Web应用中必不可少的功能,它能够帮助用户更有效地浏览和管理大量数据。在这个场景中,"BaseDao...

    spring3.2+hibernate4

    在实际项目中,我们可以通过以下步骤实现Spring 3.2与Hibernate 4的整合: 1. **配置Hibernate**:在Spring的配置文件中,我们需要定义SessionFactory Bean,指定Hibernate的相关配置,如hibernate.cfg.xml文件的...

    SpringBoot_BaseDao.zip

    4. 基本的CRUD操作实现,如insert、select、update和delete。 5. 事务管理,利用@Transactional注解控制事务边界。 通过学习这个压缩包中的内容,开发者可以加深对SpringBoot数据库操作的理解,掌握泛型和反射的...

    springmvc+spring4+hibernate5

    在整合后的系统中,可以通过BaseDao抽象类实现CURD操作,该类继承自Hibernate的Session接口,封装了基本的增删查改方法。例如,`save()`方法用于保存对象到数据库,`get()`方法根据ID获取对象,`update()`方法更新...

    企业通用BaseDao方法集

    为了实现这些功能,BaseDao一般会依赖于某种持久层框架,如Hibernate、MyBatis或JPA。这些框架提供了与数据库交互的能力,并且简化了事务控制和结果映射等操作。 总结来说,"企业通用BaseDao方法集"是企业级开发中...

Global site tag (gtag.js) - Google Analytics