- 浏览: 500185 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
来这里学java:
...
实战篇:设计自己的Annotation -
yushui2000:
突然想到一种方法,就是1、2、2、3、4、5作为5个球(类似彩 ...
一道算法题目,值得一看 -
wst0350:
理解力
实战篇:设计自己的Annotation -
yingzhor:
楼下的,你看看代码不就知道怎么验证了吗?这不是放在sessio ...
利用servlet生成简单的验证码 -
ming_7755:
妙用Commons良药<三>
这两天,有一些时间,研究一下springside的源代码,结果感觉不错,于是对自己做过一些代码做了一些优化与重构.
分页的代码如下:
(说明:这里的代码是我参考了springside的源代码后作了一些比较小的改动,这里没有给出完整的例子,只是讨论一下核心的代码)
这里想说的代码主要是泛型DAO层的应用与分页的写法.
分页,采用了hibernate的一些API来分页,这里同时采用了两种分页方式,CriteriaPage分页方式,适用于多表单时查询后分页用的,而第二种方式是采用Hql语句查询后分页的.代码如下:
CriteriaPage.java文件:
- package org.mmc.commons;
- import java.util.ArrayList;
- import java.util.List;
- import org.hibernate.Criteria;
- import org.hibernate.criterion.CriteriaSpecification;
- import org.hibernate.criterion.Projection;
- import org.hibernate.criterion.Projections;
- import org.hibernate.impl.CriteriaImpl;
- import org.hibernate.impl.CriteriaImpl.OrderEntry;
- import org.mmc.utils.BeanUtils;
- /**
- * 使用Hql查询的的分页查询类.
- * 支持执行Count查询取得总记录条数
- * 本类参考了springside项目的分页设计
- */
- public class CriteriaPage {
- /**
- * 得到一个PageInstance实例,.
- */
- public static Page getPageInstance(Criteria criteria, int pageNo, int pageSize) {
- return CriteriaPage.getPageInstanceByCount(criteria, pageNo, pageSize);
- }
- /**
- * 以查询Count的形式获取totalCount的函数
- */
- protected static Page getPageInstanceByCount(Criteria criteria, int pageNo, int pageSize) {
- CriteriaImpl impl = (CriteriaImpl) criteria;
- //先把Projection和OrderBy条件取出来,清空两者来执行Count操作
- Projection projection = impl.getProjection();
- List orderEntries;
- try {
- orderEntries = (List) BeanUtils.getPrivateProperty(impl, "orderEntries");
- BeanUtils.setPrivateProperty(impl, "orderEntries", new ArrayList());
- }
- catch (Exception e) {
- throw new InternalError(" Runtime Exception impossibility throw ");
- }
- //执行查询
- int totalCount = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult();
- //将之前的Projection和OrderBy条件重新设回去
- criteria.setProjection(projection);
- if (projection == null) {
- criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
- }
- try {
- BeanUtils.setPrivateProperty(impl, "orderEntries", orderEntries);
- } catch (Exception e) {
- throw new InternalError(" Runtime Exception impossibility throw ");
- }
- return getPageResult(criteria, totalCount, pageNo, pageSize);
- }
- /**
- * 取得totalCount后,根据pageNo和PageSize, 执行criteria的分页查询,取得Page变量
- */
- private static Page getPageResult(Criteria criteria, int totalCount, int pageNo, int pageSize) {
- if (totalCount < 1) return new Page();
- int startIndex = Page.getStartOfPage(pageNo, pageSize);
- List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
- return new Page(startIndex, totalCount, pageSize, list);
- }
- }
HqlPage.java文件的代码
Page.java文件的源代码如下:
- package org.mmc.commons;
- import java.util.ArrayList;
- /**
- * 分页对象. 包含数据及分页信息.
- *
- * @author lighter 天马行空
- */
- public class Page implements java.io.Serializable {
- /**
- * 当前页第一条数据的位置,从0开始
- */
- private int start;
- /**
- * 每页的记录数
- */
- private int pageSize = Constants.DEFAULT_PAGE_SIZE;
- /**
- * 当前页中存放的记录
- */
- private Object data;
- /**
- * 总记录数
- */
- private int totalCount;
- /**
- * 构造方法,只构造空页
- */
- public Page() {
- this(0, 0, Constants.DEFAULT_PAGE_SIZE, new ArrayList());
- }
- /**
- * 默认构造方法
- *
- * @param start
- * 本页数据在数据库中的起始位置
- * @param totalSize
- * 数据库中总记录条数
- * @param pageSize
- * 本页容量
- * @param data
- * 本页包含的数据
- */
- public Page(int start, int totalSize, int pageSize, Object data) {
- this.pageSize = pageSize;
- this.start = start;
- this.totalCount = totalSize;
- this.data = data;
- }
- /**
- * 取数据库中包含的总记录数
- */
- public int getTotalCount() {
- return this.totalCount;
- }
- /**
- * 取总页数
- */
- public int getTotalPageCount() {
- if (totalCount % pageSize == 0)
- return totalCount / pageSize;
- else
- return totalCount / pageSize + 1;
- }
- /**
- * 取每页数据容量
- */
- public int getPageSize() {
- return pageSize;
- }
- /**
- * 当前页中的记录
- */
- public Object getResult() {
- return data;
- }
- /**
- * 取当前页码,页码从1开始
- */
- public int getCurrentPageNo() {
- return (start / pageSize) + 1;
- }
- /**
- * 是否有下一页
- */
- public boolean hasNextPage() {
- return (this.getCurrentPageNo() < this.getTotalPageCount() - 1);
- }
- /**
- * 是否有上一页
- */
- public boolean hasPreviousPage() {
- return (this.getCurrentPageNo() > 1);
- }
- /**
- * 获取任一页第一条数据的位置,每页条数使用默认值
- * 关键字设为pretected
- */
- protected static int getStartOfPage(int pageNo) {
- return getStartOfPage(pageNo, Constants.DEFAULT_PAGE_SIZE);
- }
- /**
- * 获取任一页第一条数据的位置,startIndex从0开始
- * 关键字设为pretected
- */
- protected static int getStartOfPage(int pageNo, int pageSize) {
- return (pageNo - 1) * pageSize;
- }
- }
分页的改造已经完成,现在重构一下DAO层的写法,利用了spring对hibernate支持的一些的API.
DAO层:
AbstractHibernateDao.java的源代码
- package org.mmc.dao;
- import org.apache.commons.beanutils.PropertyUtils;
- import org.apache.commons.lang.StringUtils;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.hibernate.Criteria;
- import org.hibernate.criterion.MatchMode;
- import org.hibernate.criterion.Order;
- import org.hibernate.criterion.Projections;
- import org.hibernate.criterion.Restrictions;
- import org.springframework.orm.ObjectRetrievalFailureException;
- import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- import org.springframework.util.Assert;
- import org.springframework.util.CollectionUtils;
- import org.mmc.utils.GenericsUtils;
- import java.io.Serializable;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- /**
- * 纯Hibernate Entity DAO基类.
- * 通过泛型,子类无需扩展任何函数即拥有完整的CRUD操作.
- *
- */
- abstract public class AbstractHibernateDao extends HibernateDaoSupport {
- protected Log logger = LogFactory.getLog(getClass());
- /**
- * Dao所管理的Entity类型.
- */
- protected Class entityClass;
- /**
- * 取得entityClass的函数.
- * JDK1.4不支持泛型的子类可以抛开Class entityClass,重新实现此函数达到相同效果。
- */
- protected Class getEntityClass() {
- return entityClass;
- }
- /**
- * 在构造函数中将泛型T.class赋给entityClass
- */
- public AbstractHibernateDao() {
- entityClass = GenericsUtils.getGenericClass(getClass());
- }
- public T get(Serializable id) {
- T o = (T) getHibernateTemplate().get(getEntityClass(), id);
- if (o == null)
- throw new ObjectRetrievalFailureException(getEntityClass(), id);
- return o;
- }
- public List getAll() {
- return getHibernateTemplate().loadAll(getEntityClass());
- }
- public void save(Object o) {
- getHibernateTemplate().saveOrUpdate(o);
- }
- public void removeById(Serializable id) {
- remove(get(id));
- }
- public void remove(Object o) {
- getHibernateTemplate().delete(o);
- }
- public List find(String hsql, Object... values) {
- if (values.length == 0)
- return getHibernateTemplate().find(hsql);
- else
- return getHibernateTemplate().find(hsql, values);
- }
- /**
- * 根据属性名和属性值查询对象.
- *
- * @return 符合条件的唯一对象
- */
- public T findUniqueBy(String name, Object value) {
- Criteria criteria = getSession().createCriteria(getEntityClass());
- criteria.add(Restrictions.eq(name, value));
- return (T) criteria.uniqueResult();
- }
- /**
- * 根据属性名和属性值查询对象.
- *
- * @return 符合条件的对象列表
- */
- public List findBy(String name, Object value) {
- Assert.hasText(name);
- Criteria criteria = getSession().createCriteria(getEntityClass());
- criteria.add(Restrictions.eq(name, value));
- return criteria.list();
- }
- /**
- * 根据属性名和属性值以Like AnyWhere方式查询对象.
- */
- public List findByLike(String name, String value) {
- Assert.hasText(name);
- Criteria criteria = getSession().createCriteria(getEntityClass());
- criteria.add(Restrictions.like(name, value, MatchMode.ANYWHERE));
- return criteria.list();
- }
- /**
- * 根据Map中过滤条件进行查询.
- *
- * @param filter 过滤条件.
- * @param criteriaSetup 将Map中条件转换为criteria的call back类
- */
- public List findBy(Map filter, CriteriaSetup criteriaSetup) {
- Criteria criteria = getEntityCriteria();
- if (!CollectionUtils.isEmpty(filter)) {
- criteriaSetup.setup(criteria, filter);
- }
- return criteria.list();
- }
- /**
- * 函数作用同{@link #findBy(Map,CriteriaSetup)}
- * 如果不需要分页,子类可直接重载此函数.
- */
- public List findBy(Map filter) {
- return findBy(filter, getDefaultCriteriaSetup());
- }
- protected CriteriaSetup getDefaultCriteriaSetup() {
- return new CriteriaSetup() {
- public void setup(Criteria criteria, Map filter) {
- if (filter != null && !filter.isEmpty()) {
- Set keys = filter.keySet();
- for (Object key : keys) {
- String value = (String) filter.get(key);
- if (StringUtils.isNotBlank(value))
- criteria.add(Restrictions.eq((String) key, value));
- }
- }
- }
- };
- }
- /**
- * 取得Entity的Criteria.
- */
- protected Criteria getEntityCriteria() {
- return getSession().createCriteria(getEntityClass());
- }
- /**
- * 构造Criteria的排序条件默认函数.可供其他查询函数调用
- *
- * @param criteria Criteria实例.
- * @param sortMap 排序条件.
- * @param entity entity对象,用于使用反射来获取某些属性信息
- */
- protected void sortCriteria(Criteria criteria, Map sortMap, Object entity) {
- if (!sortMap.isEmpty()) {
- for (Object o : sortMap.keySet()) {
- String fieldName = o.toString();
- String orderType = sortMap.get(fieldName).toString();
- //处理嵌套属性如category.name,modify_user.id,暂时只处理一级嵌套
- if (fieldName.indexOf('.') != -1) {
- String alias = StringUtils.substringBefore(fieldName, ".");
- String aliasType = alias;
- try {
- aliasType = PropertyUtils.getProperty(entity, alias).getClass().getSimpleName();
- } catch (Exception e) {
- logger.error("Get property" + alias + " error");
- }
- criteria.createAlias(aliasType, alias);
- }
- if ("asc".equalsIgnoreCase(orderType)) {
- criteria.addOrder(Order.asc(fieldName));
- } else {
- criteria.addOrder(Order.desc(fieldName));
- }
- }
- }
- }
- /**
- * 判断对象某列的值在数据库中不存在重复
- *
- * @param names 在POJO里相对应的属性名,列组合时以逗号分割
- * 如"name,loginid,password"
- */
- public boolean isNotUnique(Object entity, String names) {
- Assert.hasText(names);
- Criteria criteria = getSession().createCriteria(entity.getClass()).setProjection(Projections.rowCount());
- String[] nameList = names.split(",");
- try {
- for (String name : nameList) {
- criteria.add(Restrictions.eq(name, PropertyUtils.getProperty(entity, name)));
- }
- String keyName = getSessionFactory().getClassMetadata(entity.getClass()).getIdentifierPropertyName();
- if (keyName != null) {
- Object id = PropertyUtils.getProperty(entity, keyName);
- //如果是update,排除自身
- if (id != null)
- criteria.add(Restrictions.not(Restrictions.eq(keyName, id)));
- }
- }
- catch (Exception e) {
- logger.error(e.getMessage());
- return false;
- }
- return ((Integer) criteria.uniqueResult()) > 0;
- }
- }
上面只是简单的说了一下的springside项目源代码的一些优雅的地方,如果有需要的要求的话,我会贴出完整的一个简单例子的demo的,包括分页的与泛型DAO的应用.
评论
5 楼
xugq035
2009-08-17
请问一下如果通过hql查询,如果语句中包含distinct怎么办?
String countQueryString = " select count (*) " + removeSelect(removeOrders(hql));
这样查询出来的总数好像不正确
String countQueryString = " select count (*) " + removeSelect(removeOrders(hql));
这样查询出来的总数好像不正确
4 楼
fudehai001
2009-02-21
贴出完整的一个简单例子的demo --盼望中,辛苦了
3 楼
huobao89
2008-10-10
想问一下 如果 用 startIndex做,在页面用pager-taglib 做分页,怎么传参数给
export="pageOffset,pageNumber"
谢谢
export="pageOffset,pageNumber"
谢谢
2 楼
junzhonxiaozi
2007-04-05
谢谢分享,我正需要这方面的例子学习学习
可以贴出让大家分享么!
邮箱(交流学习):junzhonxiaozi@126.com
可以贴出让大家分享么!
邮箱(交流学习):junzhonxiaozi@126.com
1 楼
j2292003
2006-12-26
如果page分页的Criteria 含有group by 等,你是如何解决的?
先把Projection和OrderBy条件取出来,清空两者来执行Count操作 ,这意味着取出Projection时,取出了group by等条件,这样执行的结果不一样,本人也遇到了这个问题,暂时没有想到好的解决方法,判交流:j2292003@hotmail.com
先把Projection和OrderBy条件取出来,清空两者来执行Count操作 ,这意味着取出Projection时,取出了group by等条件,这样执行的结果不一样,本人也遇到了这个问题,暂时没有想到好的解决方法,判交流:j2292003@hotmail.com
发表评论
-
TestNG系列2:TestNG初接触
2008-04-18 22:52 3550首先来看一个非常简单 ... -
TestNG系列1:TestNG简介及插件
2008-04-18 22:19 6376一、什么是TestNG 引用TestNG是根据JUnit 和 ... -
用jdbcTempate调用存储过程,处理BLOB/CLOB小记
2007-11-06 00:20 90971、利用spring的jdbcTemplate调用存储过程 假 ... -
怎样利用spring简单地发送邮件
2007-11-03 16:45 3828SMTP:简单邮件传输协议,用于发送电子邮件的传输协议. PO ... -
搜索篇:Struts、Lucene的Web实例
2007-01-15 23:10 7964代码是网上下载的,有兴趣的可以看一下 这里用到的Lucene是 ... -
复习笔记:利用spring的BeanName简化事务管理配置
2006-12-30 00:27 6194常常在项目开发时候,很多目标bean需要生成事务代理,当然可以 ... -
Stripes 快速入门指南[翻译]
2006-12-27 18:56 10483说明:这是Stripes文档中的一篇叫Quick Start ... -
搜索篇:lucene简单实例<二>
2006-12-20 23:09 10735写文章的时候,感觉比较难写的就是标题,有时候不知道起什么名字好 ... -
搜索篇:lucene简单实例<二>
2006-12-20 23:00 123写文章的时候,感觉比较难写的就是标题,有时候不知道起什么名字好 ... -
搜索篇:lucene的简单实例<一>
2006-12-19 20:12 13475说明一下,这一篇文章的用到的lucene,是用2.0版本的,主 ... -
一个比较完整的ANT实例
2006-12-19 19:41 8385Ant是一种专为java量身订做的构建工具,基础已经了java ... -
对struts2的的一些不满
2006-11-12 01:06 3001个人对struts2的一些不满的地方 1、基本大部分全抄web ... -
从webwork2.2.4迁移到struts2
2006-11-12 00:47 2608注:(originally posted on the Web ... -
webwork2.2到struts2的变化
2006-11-12 00:44 2214While Struts 2 started with the ... -
反思spring:由Ruby on Rails想到的
2006-10-23 09:33 3280[size=11] 众所周知,RoR里面的指导原则有: 第 ... -
关于jboss,weblogic的配置
2006-05-26 22:28 3480###################以下是jboss的配置# ... -
[转载] 无所不能的“蚂蚁”--Ant
2006-06-05 23:27 3857说他无所不能,好像有点夸张,但是用过Ant之后,感觉真的是只有 ... -
Hibernate, Java 5 and DAO[转]
2006-08-04 17:54 2497...
相关推荐
总的来说,"springside3+ext源代码"是一个集成了多种主流Java技术的实战项目,适合希望深入研究Spring生态、EXTJS以及MVC架构的开发者进行学习和借鉴。通过这个项目,开发者不仅可以提升技术水平,还能了解到实际...
SpringSide-core是SpringSide项目的核心部分,包含了项目的基础构建模块和核心功能。4.1.0版本是SpringSide的一个重要里程碑,它带来了诸多改进和优化。 二、SpringSide-core-4.1.0关键组件 1. **依赖管理**:...
在SpringSide的压缩包文件中,"springside"可能是一个示例项目的根目录,包含了项目的所有源代码、配置文件和资源。通过分析这个目录,我们可以学习到SpringSide如何组织项目结构,以及如何配置和使用Spring的各个...
1. **模块化设计**:springside采用模块化设计,将项目划分为多个独立的模块,如核心模块、安全模块、AOP模块等,使得代码结构清晰,易于维护和扩展。 2. **依赖管理**:springside使用Maven进行依赖管理,通过预...
1. `core`:核心模块,包含 SpringSide 的基础工具类和配置管理,如日志、国际化、属性文件处理等。 2. `modules`:模块化设计,包括示例模块、数据库访问模块、Web 模块等,便于开发者根据需求选择使用。 3. `tools...
这些部分讲述了如何进行动态组合查询条件、使用Hibernate二级缓存、以及如何配置数据源和事务管理。 为了提升性能,文档介绍了各种缓存技术,包括Ehcache、Guava Cache以及分布式缓存的实现。还提到了如何在Ehcache...
通过对SpringSide 3.0.1源代码的深入研究,不仅可以加深对Spring框架的理解,还能了解到现代Java企业级开发的各种最佳实践和工具使用。这是一次难得的学习和提升技术的机会,对于任何想要成为专业Java开发者的人来说...
这个工程包含了一系列配置文件、源代码和资源,帮助用户理解Spring框架的核心概念和工作方式。 在Eclipse工程中,我们通常会看到以下关键组成部分: 1. **pom.xml**:这是Maven项目的配置文件,定义了项目依赖、...
4.1.0.GA版本是该项目的一个稳定发布,包含了对SpringSide核心功能的优化和改进,确保了代码的稳定性和性能。 首先,"springside-core-4.1.0.GA"是核心模块的主JAR文件,其中封装了SpringSide的核心类和接口。这个...
《SpringSide 3.0:Java企业开发的高效框架指南》 SpringSide 3.0 是一个基于Spring框架的开源项目,旨在为Java...理解并掌握SpringSide 3.0 的核心知识点,对于提升Java企业级应用的开发效率和质量具有重要意义。
- 构建过程会自动下载所需的依赖库、编译Java源代码、执行单元测试并打包成WAR文件。 2. **部署项目**: - 将构建好的WAR文件部署到Web服务器上(例如Tomcat或Jetty)。 - 启动Web服务器,并访问部署的应用程序...
本文将深入探讨springside.jar的核心功能,以及如何在实际项目中有效利用它。 一、springside.jar简介 springside.jar是基于Spring框架的一个轻量级工具库,旨在简化企业级Java开发。它由springside-project组织...
本版本,即“springside3.3”,是专为MyEclipse集成环境设计的,包含了完整的功能代码,方便开发者在MyEclipse中进行开发和调试。同时,它还附带了数据.sql文件,意味着我们可以直接导入数据库,快速搭建项目环境。 ...
通过深入研究 SpringSide 3.3.4 的源代码,开发者不仅能掌握 Spring 框架的使用,还能学习到如何构建高效、可维护的企业级应用。同时,对于想要提升自身 Java 开发技能的程序员来说,SpringSide 是一个不可多得的...
1. **Core**:这是SpringSide的核心模块,包含了一些通用的工具类和配置,如日志管理、代码生成器、属性文件管理等,为项目提供了基础服务。 2. **Demo**:示例模块,提供了各种应用场景的实例,帮助开发者快速理解...
4. **代码规范和最佳实践**:SpringSide强调代码质量,提供了统一的编码风格和最佳实践,这有助于保持团队间的代码一致性,并提高代码可读性和维护性。 5. **项目模板**:SpringSide通常包含一系列预定义的项目模板...
通过深入研究SpringSide 4.0.0.GA,开发者可以学习到如何有效地整合Spring Framework和其他相关技术,提升自己的JavaEE开发技能。无论是对于新手还是资深开发者,SpringSide都是一个不可多得的学习和参考资料库,它...
《深入解析springside3:源码与jar剖析》 springside3是一个基于Spring框架的轻量级Java开发工具集,它旨在简化企业级应用的开发过程...对于想要深入了解Java企业级开发的程序员来说,研究springside3无疑是一条捷径。
SpringSide3不仅包含了Spring框架的核心概念,还涵盖了Spring在实际开发中的各种应用场景,帮助开发者深入理解并熟练运用Spring进行软件开发。 一、Spring框架概述 Spring是一个开源的企业级应用框架,它以依赖注入...