`
xiaozhiwz
  • 浏览: 15789 次
  • 性别: 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;

这三个哪去了?

相关推荐

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

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

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

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

    SpringMvc(4.0)+hibernate(4.0)

    文档详细的描述了一个SpringMvc(4.0)+hibernate(4.0)构建的一个项目demo,实现了数据的CRUD基本操作,项目里面使用的是mysql,项目所需要的jar,在里面的百度云连接也可以下载,希望有所帮助

    basic-common2h3:基于hibernate3的BaseDao,完成增删改查、分页操作

    实现一个基于hibernate3的基本的dao,实现CRUD; 一行代码完成CRUD,提供多种重载方法详见IBaseDao,但是项目需要基于SSH框架。 ============ 使用方法,以用户添加为例: 1、定义User类,并提供get和set方法。 2、...

    Java_BaseDao

    提供CRUD便捷功能、条件查询、数据库访问 自动生成SQL语句、填充实体或pojo,增加修改操作需传入实体对象 SQL语句实现缓冲。 使用需继承BaseDao,数据库连接类需继承AbstractCreateDBConnection

    整合spring3-hibernate的小项目(一)

    【SSH学习笔记】整合spring3-hibernate的小项目(一) 配套资源 需求分析: 1、使用spring注入dataSourse数据源 2、使用BaseDao获取注入SessionFactory并返回Session 3、实现查询所有和按字符串查询的方法 4、...

    Hibernate4.3.5myFilter

    本代码包含了hibernate 的一对多的双向关联,实现级联保存,并整合了Hibernate的过滤器功能、c30的数据库连接池功能。

    整合spring3-hibernate的小项目(二)

    【SSH学习笔记】整合spring3-hibernate的小项目(二) 配套资源 需求分析: 1、使用spring注入dataSourse数据源 2、使用BaseDao获取注入SessionFactory并返回Session 3、用generic接口及其实现类,实现泛型化的...

    spring4.0+spring MVC4.0+hibernate4.3全注解

    spring4.0+spring MVC4.0+hibernate4.3框架整合测试案例,支持事务,全注解,配置清晰,基础BaseDao接口实现都已写好,MVC分层,含所有需要的jar包,数据库文件。

    三大框架整合源代码

    1.jar包都在WEB-INF的lib目录下面...5.完成功能有:事物配置,日志输出,单元测试,分页组建,baseDao的实现等等 6.所有代码几乎都有注释,非常清晰 7.已实现登陆小功能,直接敲http://ipAddress:port/sshTest即可访问

    ssh(struts2.3.8+spring3.2+heibernate4.1+annotation零配置

    实现了简单用户权限登录,项目中含有mysql数据库 加入了基本的拦截器,错误类处理等 加入了BaseDao,Spring3对Hibernate4已经没有了HibernateDaoSupport和HibernateTemplate的支持,使用了原生态的API

    java数据访问层的基本实现

    利用org.springframework.orm.hibernate3.support.HibernateDaoSupport 实现对java数据访问层的基本实现,包含增删改查分页方法。

    自动代码生成

    用过hibernate的朋友们都知道,有个强大的东西叫 JPA,还有个更NB的东西叫spring-data,但是Mybatis更好用啊,而且灵活。可是Mybatis就可怜了,没有上面那些东西,在网上找,也有一些类似jpa的产品出现,但是总感觉...

    初学JAVA-WEB开发的小项目

    在web层和dao层都提取了公共代码封装到BaseAction和BaseDao中,提高了代码的复用,同时按照OO设计原则,针对接口编程,而不是针对实现编程。 使用拦截器的方法对系统权限进行初步控制(后续可以采用Shiro框架进行...

    一套适合初学者的JAVA-WEB开发的小项目

    在web层和dao层都提取了公共代码封装到BaseAction和BaseDao中,提高了代码的复用性,同时遵循OO设计原则,接口是针对编程的,而不是针对实现编程的。 使用拦截器的方法对系统权限进行初步控制(后续可以采用Shiro...

    基于SpringJDBC的轻量级ORM框架sborm.zip

    4、分表操作的支持:对于分表操作和常规的使用没有区别,只是指定分表规则,mybatis好像也可以通过制定参数实现分表处理,没搞清楚hibernate对这个是怎么处理的(hibernate好像是bean和表一对一绑定的)? ...

    使用反射技术和Facade模式演示封装数据库操作--ORM原理

    给客户端代码方式是通过Facade对象封装DAO类,以及业务逻辑接口来实现的。对于数据库表与POJO类的映射是使用反射技术来完成。metainform部分使用.properties文档来对应Hibernate的xml影射档。我偷懒没有把jdbc部分...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    本网站以xp为Web平台,JSP+Ajax+Servlet+JavaBean+Hibernate为网站实现技术,建立基于MySQL数据库系统的核心动态网页,实现博客网站前台及博客个人维护管理等功能模块。 1、 系统处理的准确性和及时性:系统处理的...

Global site tag (gtag.js) - Google Analytics