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); } }
相关推荐
Spring整合hibernate(4)之BaseDao的编写示例 说明:因为我们在实际编码中会编写一些重复的数据库操作方法CRUD,每个类都写一次感觉很繁琐,因此可以考虑考虑把所有公共的方法都写在BaseDao中,这个时候,让所有的...
用spring4 mvc、spring security3、hibernate4、kapctha实现的用户登录系统。baseDao被放在了另外的项目中。因为对泛型不熟悉,多数方法放在Dao里面。简单说,很粗糙啦。
文档详细的描述了一个SpringMvc(4.0)+hibernate(4.0)构建的一个项目demo,实现了数据的CRUD基本操作,项目里面使用的是mysql,项目所需要的jar,在里面的百度云连接也可以下载,希望有所帮助
实现一个基于hibernate3的基本的dao,实现CRUD; 一行代码完成CRUD,提供多种重载方法详见IBaseDao,但是项目需要基于SSH框架。 ============ 使用方法,以用户添加为例: 1、定义User类,并提供get和set方法。 2、...
提供CRUD便捷功能、条件查询、数据库访问 自动生成SQL语句、填充实体或pojo,增加修改操作需传入实体对象 SQL语句实现缓冲。 使用需继承BaseDao,数据库连接类需继承AbstractCreateDBConnection
【SSH学习笔记】整合spring3-hibernate的小项目(一) 配套资源 需求分析: 1、使用spring注入dataSourse数据源 2、使用BaseDao获取注入SessionFactory并返回Session 3、实现查询所有和按字符串查询的方法 4、...
本代码包含了hibernate 的一对多的双向关联,实现级联保存,并整合了Hibernate的过滤器功能、c30的数据库连接池功能。
【SSH学习笔记】整合spring3-hibernate的小项目(二) 配套资源 需求分析: 1、使用spring注入dataSourse数据源 2、使用BaseDao获取注入SessionFactory并返回Session 3、用generic接口及其实现类,实现泛型化的...
spring4.0+spring MVC4.0+hibernate4.3框架整合测试案例,支持事务,全注解,配置清晰,基础BaseDao接口实现都已写好,MVC分层,含所有需要的jar包,数据库文件。
1.jar包都在WEB-INF的lib目录下面...5.完成功能有:事物配置,日志输出,单元测试,分页组建,baseDao的实现等等 6.所有代码几乎都有注释,非常清晰 7.已实现登陆小功能,直接敲http://ipAddress:port/sshTest即可访问
实现了简单用户权限登录,项目中含有mysql数据库 加入了基本的拦截器,错误类处理等 加入了BaseDao,Spring3对Hibernate4已经没有了HibernateDaoSupport和HibernateTemplate的支持,使用了原生态的API
利用org.springframework.orm.hibernate3.support.HibernateDaoSupport 实现对java数据访问层的基本实现,包含增删改查分页方法。
用过hibernate的朋友们都知道,有个强大的东西叫 JPA,还有个更NB的东西叫spring-data,但是Mybatis更好用啊,而且灵活。可是Mybatis就可怜了,没有上面那些东西,在网上找,也有一些类似jpa的产品出现,但是总感觉...
在web层和dao层都提取了公共代码封装到BaseAction和BaseDao中,提高了代码的复用,同时按照OO设计原则,针对接口编程,而不是针对实现编程。 使用拦截器的方法对系统权限进行初步控制(后续可以采用Shiro框架进行...
在web层和dao层都提取了公共代码封装到BaseAction和BaseDao中,提高了代码的复用性,同时遵循OO设计原则,接口是针对编程的,而不是针对实现编程的。 使用拦截器的方法对系统权限进行初步控制(后续可以采用Shiro...
4、分表操作的支持:对于分表操作和常规的使用没有区别,只是指定分表规则,mybatis好像也可以通过制定参数实现分表处理,没搞清楚hibernate对这个是怎么处理的(hibernate好像是bean和表一对一绑定的)? ...
给客户端代码方式是通过Facade对象封装DAO类,以及业务逻辑接口来实现的。对于数据库表与POJO类的映射是使用反射技术来完成。metainform部分使用.properties文档来对应Hibernate的xml影射档。我偷懒没有把jdbc部分...
本网站以xp为Web平台,JSP+Ajax+Servlet+JavaBean+Hibernate为网站实现技术,建立基于MySQL数据库系统的核心动态网页,实现博客网站前台及博客个人维护管理等功能模块。 1、 系统处理的准确性和及时性:系统处理的...