- 浏览: 7189210 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (397)
- 架构研究 (44)
- 网络协议-TCP/HTTP (20)
- SPRING (23)
- HIBERNATE 3 (30)
- STRUTS 2 (20)
- Java/J2se (25)
- Servlet/Jsp (9)
- 开发工具IDE (10)
- WEB服务器 (17)
- 前端--Java Script (33)
- 前端--CSS (7)
- OS--Linux (31)
- OS--MAC OS (19)
- MySQL数据库 (19)
- Oracle数据库 (11)
- 项目管理工具 (12)
- 数据报表技术 (4)
- 图像处理技术 (10)
- 其它综合技术 (13)
- 权限管理 (1)
- MyBatis (1)
- 网络安全 (6)
- IO (21)
- PostgreSQL (2)
- Eclipse RCP (1)
- GWT (1)
- 算法 (3)
- Storm (2)
- zookeeper (3)
- 消息 (1)
最新评论
-
bukebuhao:
已解决,打开文件太多。ulimit -n 上次临时生效后再次s ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
bukebuhao:
ds重启后启动不了。报错信息如下,请大神帮助[2018-08- ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
墨上清:
感谢,看完有了一个完整的知识网络。
Spring MVC 教程,快速入门,深入分析 -
云卷云舒灬:
谢谢,学到很多
Spring MVC 教程,快速入门,深入分析 -
luozhy:
非常感谢非常感谢
Project Web Access ActiveX控件 安装
JE有两篇文章,关于分页查询 与泛型 的,写的很好.这里收藏一下.
---------------------------------------------
下面是我自己写的分页方法,同时也参考了上面两篇文章.
以下代码用在了实际的项目中.
Page类,计算分页数据
package common.dao; /** * 分页功能 */ public class Page { public final int DEFAULT_PAGESIZE = 15; // 每页记录数 public final int DEFAULT_PAGE = 1; // 默认显示第几页 // ========================================================================================= protected int count; // 总的记录数 protected int pageSize; // 每页记录数 protected int pageCount; // 总的页数 protected int page; // 本页页号 protected int start; // 起始记录下标(MySql从0开始) // ========================================================================================= /** * 构造方法 * * @param nPageSize * 每页记录数 * @param nPage * 本页页号 */ public Page(final int nPageSize, final int nPage) { pageSize = nPageSize; // 每页大小 page = nPage; // 本页页号 } /** * 构造方法 ,默认每页20条记录 * * @param nPage * 本页页号 */ public Page(final int nPage) { pageSize = DEFAULT_PAGESIZE; // 每页大小 page = nPage; // 本页页号 } /** * 构造方法 ,默认每页20条记录,显示第一页 * */ public Page() { pageSize = DEFAULT_PAGESIZE; // 每页大小 page = DEFAULT_PAGE; // 本页页号 } /** * 分页初始化 * * @param nCount * 总的记录数 */ public void init(final int nCount) { init(nCount, pageSize, page); } /** * 分页初始化;记录总记录数,每页记录数,当前页,并计算总页数、本页大小和检测当前页是否有效 * * @param nCount * 总的记录数 * @param nPageSize * 每页记录数 * @param nPage * 本页页号 */ public void init(final int nCount, final int nPageSize, final int nPage) { count = nCount; // 总的项数 page = nPage; // 本页页号 pageSize = nPageSize; // 每页大小 if (0 >= pageSize) { pageSize = DEFAULT_PAGESIZE; } pageCount = (nCount + pageSize - 1) / pageSize; // 计算总的页数 // 防止 Page 超范围并计算当前页大小 if (page > pageCount) { page = pageCount; } if (page < 1) { page = DEFAULT_PAGE; } start = min(); } /** * 计算起始记录下标(MySql从0开始) * * @return */ public int min() { final int max = page * pageSize - 1; return max - pageSize + 1; } // public int max() // { // final int max = page * pageSize - 1; // return max; // } /** * 计算导航页(开始页号) * * @param nPageNav * 导航页数 * @return 开始页号 */ public final int CalcMinPage(final int nPageNav) { int min = page - (nPageNav / 2); int max = page + (nPageNav / 2); if (min < 1) { final int a = 0 - min; min = 1; max = max + a; } if (max > pageCount) { final int b = max - pageCount; max = pageCount; min = min - b < 1 ? 1 : min - b; } return min; } /** * 计算导航页(结束页号) * * @param nPageNav * 导航页数 * @return 结束页号 */ public final int CalcMaxPage(final int nPageNav) { int min = page - (nPageNav / 2); int max = page + (nPageNav / 2); if (min < 1) { final int a = 0 - min; min = 1; max = max + a; } if (max > pageCount) { final int b = max - pageCount; max = pageCount; min = min - b < 1 ? 1 : min - b; } return max; } @Override public String toString() { final StringBuffer sbf = new StringBuffer(); sbf.append(" 总的记录数:" + count); sbf.append(" 每页记录数:" + pageSize); sbf.append(" 总的页数:" + pageCount); sbf.append(" 本页页号:" + page); sbf.append(" 起始记录下标:" + start); return sbf.toString(); } public int getCount() { return count; } public void setCount(final int count) { this.count = count; } public int getPageSize() { return pageSize; } public void setPageSize(final int pageSize) { this.pageSize = pageSize; } public int getPageCount() { return pageCount; } public void setPageCount(final int pageCount) { this.pageCount = pageCount; } public int getPage() { return page; } public void setPage(final int page) { this.page = page; } public int getStart() { return start; } public void setStart(final int start) { this.start = start; } }
WebPage (继承自Page) 扩展了在JSP页面上显示 "上一页 1 2 3 下一页" 的功能
package common.web; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import common.dao.Page; public class WebPage extends Page { public final int DEFAULT_NAV_SIZE = 20; // 导航页数 private boolean center = true; //默认居中 private String className = "page_css"; //默认CSS /** * 构造方法 * * @param nPageSize * 每页记录数 * @param nPage * 本页页号 */ public WebPage(final int nPageSize, final int nPage, final String sPageURLParas) { super(nPageSize, nPage); setPageURL(sPageURLParas); } /** * 构造方法 * * @param nPageSize * 每页记录数 * @param nPage * 本页页号 */ public WebPage(final int nPageSize, final int nPage) { super(nPageSize, nPage); setPageURL(""); } /** * 构造方法 ,默认每页20条记录 * * @param nPage * 本页页号 */ public WebPage(final int nPage) { super(nPage); setPageURL(""); } private String pageURL; // 导航地址 private String pageNAV; // 导航表格 public void setPageURL(final String sPageURLPara) { //final HttpServletRequest request, final HttpServletRequest request = ServletActionContext.getRequest(); if (sPageURLPara.length() > 0) { pageURL = "?" + sPageURLPara.substring(1) + "&"; } else { pageURL = "?"; } pageURL = request.getRequestURI() + pageURL + "page="; pageNAV = null; } public String getPageNAV() { final int nPageNav = DEFAULT_NAV_SIZE; // 导航页数 final int nPage = page; // 当前页号 final int nPageMin = CalcMinPage(nPageNav); // 开始页号 final int nPageMax = CalcMaxPage(nPageNav); // 结束页号 final StringBuffer sPageNav = new StringBuffer(1024); if (nPageMin < nPageMax) { sPageNav.append("<table class=\"" + className + "\""); if (center) { //导航条居中 ,样式表 sPageNav.append(" align=\"center\">"); } sPageNav.append("<tr>\r\n"); if (nPageMin != nPage) { sPageNav.append("<td><a href=\""); sPageNav.append(pageURL + (nPage - 1)); sPageNav.append("\">上页</a></td>\r\n"); } else { sPageNav.append("<td>上页</td>\r\n"); } for (int i = nPageMin; i <= nPageMax; i++) { sPageNav.append("<td>"); if (i != nPage) { sPageNav.append("<a style='text-decoration: underline' href=\""); sPageNav.append(pageURL + (i)); sPageNav.append("\">"); } if (i != nPage) { sPageNav.append(i); } else { sPageNav.append("<b style='color:#ff7700'>" + (i) + "</b>"); } if (i != nPage) { sPageNav.append("</a>"); } sPageNav.append("</td>\r\n"); } if (nPageMax != nPage) { sPageNav.append("<td><a style='text-decoration: underline' href=\""); sPageNav.append(pageURL + (page + 1)); sPageNav.append("\">下页</a></td>\r\n"); } else { sPageNav.append("<td>下页</td>\r\n"); } sPageNav.append("</tr></table>\r\n"); } pageNAV = sPageNav.toString(); return pageNAV; } public boolean isCenter() { return center; } public void setCenter(final boolean center) { this.center = center; } public String getClassName() { return className; } public void setClassName(final String className) { this.className = className; } }
HibernateUtil 类,有两种分页方法
package pic.dao; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Projections; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.stereotype.Repository; import common.dao.Page; @Repository public class HibernateUtil extends HibernateDaoSupport { /** * 注入sessionFactory * * @param sessionFactory */ @Resource(name = "sessionFactory") public void setFactory(final SessionFactory sessionFactory) { //HibernateDaoSupport上的方法,注入sessionFactory setSessionFactory(sessionFactory); } /** * 取得当前session * * @return */ public Session getCS() { return this.getSession(); //return this.getSessionFactory().getCurrentSession(); } /** * HQL分页查询 * * @param page * 分页对象,包含分页信息,如每页记录数,当前页码等 * @patam patam 参数集合 HQL如下:from User where expertname like :expertname * map.put("expertname", "%" + expertName + "%"); * expertname是HQL中的:expertname * * @param hqlCount * 计算总记录数的sql * @param hql * 查询的Sql * @return List 结果集合 */ @SuppressWarnings("unchecked") public List findListPage(final Page page, final Map param, final String hqlCount, final String hql) { final Session session = this.getCS(); //查询总记录条数的Query final Query query_count = session.createQuery(hqlCount); //查询的Query final Query query = session.createQuery(hql); if (param != null) { //query.setProperties(param); final Iterator it = param.keySet().iterator(); while (it.hasNext()) { final Object key = it.next(); //两个Query查询条件相同 query_count.setParameter(key.toString(), param.get(key)); query.setParameter(key.toString(), param.get(key)); } } //总记录数 final int nCount = ((Long) query_count.iterate().next()).intValue(); //计算分页数据 page.init(nCount); //从第N条开始 query.setFirstResult(page.getStart()); //取出X条 query.setMaxResults(page.getPageSize()); final List list = query.list(); return list; } /** * Criteria 分页查询, 要事先设置好查询条件, 再把Criteria对象传进来 * * @param page * 分页对象 * @param criteria * Criteria对象,要事先设置好查询条件, 再把Criteria对象传进来 , * 如criteria.add(Restrictions.eq("name", "zl")) * * @return 结果集合 */ @SuppressWarnings("unchecked") public List findListPage(final Page page, final Criteria criteria) { // 获取根据条件分页查询的总行数 final int rowCount = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult(); criteria.setProjection(null); //计算分页数据 page.init(rowCount); criteria.setFirstResult(page.getStart()); criteria.setMaxResults(page.getPageSize()); return criteria.list(); } }
JUnit测试类
package junit_test.pic.dao; import java.util.HashMap; import java.util.List; import java.util.Map; import junit_test.base.JUnitBase_svc; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; import org.junit.BeforeClass; import org.junit.Test; import pic.dao.HibernateUtil; import pic.dao.entity.Email; import pic.svc.EmailManager; import common.dao.Page; /** * 测试HibernateUtil 基类 * * @author zl * */ public class HibernateUtilTest extends JUnitBase_svc { static HibernateUtil hibernateUtil; @BeforeClass public static void setUpBeforeClass() throws Exception { hibernateUtil = (HibernateUtil) getBean("hibernateUtil"); } /** * 测试取得hibernateUtil bean */ @Test public void testGetHibernateUtil() { assertNotNull(hibernateUtil); } @Test public void add() { //先添加一些邮件 for (int i = 0; i < 7; i++) { final Email email = new Email(); email.setContent("内容2"); email.setIndex(2); email.setQueueName("队列名称2"); email.setReceivers("Receivers2"); email.setSubject("Subject2"); email.setSum(20); final EmailManager emailManagerImpl = (EmailManager) getBean("emailManagerImpl"); emailManagerImpl.add(email); } } /** * 测试分页方法 */ @SuppressWarnings("unchecked") @Test public void testFindListPage() { //分页测试 , 第一页 final String where = " where content=:content "; final String hqlCount = "select count(*) from Email" + where; final String hql = "from Email" + where; final Map<String, Object> param = new HashMap<String, Object>(); param.put("content", "内容2"); final List<Email> list = hibernateUtil.findListPage(new Page(), param, hqlCount, hql); for (final Email e : list) { System.out.println(e.toString()); } //测试 超出总页数 hibernateUtil.findListPage(new Page(10000), param, hqlCount, hql); //测试 当前页码小于0 hibernateUtil.findListPage(new Page(-1), param, hqlCount, hql); } /** * 测试分页方法 */ @Test public void testFindListPage2() { final Session session = getNewS(); final Criteria criteria = session.createCriteria(Email.class); criteria.add(Restrictions.eq("content", "内容2")); //criteria.add(Restrictions.like(propertyName, value)) final List<Email> list = hibernateUtil.findListPage(new Page(2), criteria); for (final Email e : list) { System.out.println(e.toString()); } } }
发表评论
-
Hibernate二级缓存 ---- 最佳实践
2010-11-08 10:17 39285作者:赵磊 博客:ht ... -
Hibernate--泛型DAO
2010-06-27 19:49 5051泛型DAO(翻译) http://www.iteye.com ... -
Hibernate--空位
2010-06-27 15:41 1796原文章已合并整理到: http://elf8848.itey ... -
Hibernate二级缓存 ---- 入门示例
2010-06-27 15:34 4149一. 我们使用oscache来演示 , 引入oscache的j ... -
Hibernate 操作Blob Clob
2010-06-14 16:50 5250Photo.java import java.sql.Bl ... -
Hibernate ---- 控制日志
2010-06-06 11:46 3043Hibernate版本 3.3或3.4 Hibernate ... -
Hibernate悲观锁定与乐观锁定
2010-05-17 15:08 2241悲观锁定 由数据库方面实现. 可见:Hibernate悲观锁 ... -
Hibernate懒加载深入分析
2010-05-14 11:22 8281[size=small] ------------------ ... -
Hibernate批量操作(JDBC批量操作)
2009-03-30 14:52 8401部分内容转自 :http://ga ... -
20 Hibernate 1+N问题的原理与解决
2009-03-04 09:44 13075什么时候会遇到1+N的问题? 前提:Hibernate默认表 ... -
19 Criteria查询,DetachedCriteria离线查询 --做综合查询
2009-03-04 09:35 3732通过Session得到Criteria类的对象 /** ... -
空位空位
2009-03-03 10:22 2332空位空位空位空位 -
17 继承(四)每一个具体的类 映射到一张表
2009-03-02 13:54 2297类(Person) , 男人(Men)继 ... -
16 继承(三)(把前面14,15讲的情况结合起来)
2009-03-02 13:30 2091人类(Person) , 男人(Men)继承"人& ... -
15 继承(二)(每个子类扩展的属性单独保存在一张表中)
2009-03-02 13:07 2068人类(Person) , 男人(Men)继承" ... -
14 继承(一)(整个继承树映射到一张表)
2009-03-02 11:00 2224人类(Person) , 男人(Men)继承" ... -
13 级联和关系维护(Cascade 和Inverse)
2009-03-01 17:58 3039Cascade用来说明当对主对象进行某操作时, 是否对其关联的 ... -
12 映射-- 集合类的映射(Set,List,Map,Array)
2009-03-01 16:18 2621部门类Department , 他有 empa1, emp ... -
11 映射-- 组件映射(人类与姓名类)
2009-03-01 15:26 2360User类: 注意他的name属性 package ... -
10 映射-- 多对多(老师与学生)
2009-03-01 15:01 2576学生类: package dao.po; impo ...
相关推荐
总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...
- 在此案例中,可能使用了Hibernate的`Criteria`或`HQL`查询语言配合`PageRequest`或自定义分页实现,通过指定页码和每页大小来获取特定范围的数据。 6. **文件名:user** - "user"可能是数据库中的一个表名,...
此外,了解SQL语言也是必要的,虽然Hibernate可以自动生成SQL,但在某些复杂查询场景下,可能需要手动编写SQL。最后,熟悉Spring框架和其他与Hibernate整合的技术,如Spring Data JPA,能够进一步提升开发效率。
通用查询页面中的查询项、查询出的分页列表都是自动生成的。开发简便、快速,附件中是一套完整的demo和使用说明 支持全部Hql语法格式 Awake 后续功能扩展 1.XML格式数据输出,保证了ajax用户也可以使用Awake框架...
### 泛型Hibernate的实现与Spring集成 #### 一、泛型Hibernate概念及其实现 在Java开发领域,尤其在企业级应用开发中,Hibernate框架因其强大的对象关系映射(ORM)能力而受到广泛欢迎。泛型Hibernate是利用Java...
而`PageBean`可能是一个用于分页查询的辅助类,封装了当前页、每页数量以及数据列表等信息。 这种非泛型的DAO实现方式可能会牺牲一些灵活性,但它简化了代码结构,降低了学习和使用的门槛,尤其适合小规模项目或者...
在SSH框架中,可以结合Hibernate的Criteria API或HQL实现分页查询。通常需要指定每页的记录数和当前页码,返回相应的数据列表和总记录数。 在实际开发中,"SSH 泛型DAO分页"的整合可能涉及到以下步骤: - 配置SSH...
在这个特定的讨论中,我们聚焦于SSH1中的一个关键概念:通用泛型DAO(Data Access Object)以及分页功能的实现。DAO层是模型层和数据访问层之间的桥梁,它的主要职责是处理数据库操作,为业务层提供无状态的数据访问...
总结,泛型Hibernate DAO是企业级应用中常见的设计模式,它封装了数据库操作,使得业务逻辑层与数据访问层分离,提高了代码的可复用性和可测试性。在实际开发中,可以根据项目的具体需求,对这个基础实现进行扩展和...
1. 创建一个泛型的DAO接口,定义分页查询的方法,参数可能包括实体类的类型、查询条件、当前页数和每页大小。 2. 实现DAO接口,使用Hibernate的Session和Query对象进行分页查询,并返回结果集。 3. 在Service层中,...
5. 分页查询(Paging):提供分页查询功能,通常结合"Page"类使用。 接下来是"Page"类。在大型应用中,为了提高用户体验,通常会采用分页显示数据。Page类是用来表示分页结果的,它通常包含当前页数、总页数、每页...
4. Query和Criteria的创建与配置:返回已经设置好基本查询条件的Query和Criteria对象,方便开发者添加更多的查询参数。 5. 分页功能:提供pagedQuery()方法,除了获取分页结果外,还会计算总记录数,以满足显示分页...
- 分页查询:封装分页查询方法,如`List<T> findByPage(int pageNum, int pageSize)`,以支持大数据量的场景。 7. **异常处理**: 在DAO层捕获和处理Hibernate抛出的异常,如`HibernateException`,并根据业务...
在实际项目中,我们通常会根据需求进一步细化泛型DAO,比如添加分页查询、按条件查询等功能。此外,为了更好地适应业务需求,我们还可以考虑使用Spring的`@Repository`注解进行组件管理,并结合`@Transactional`注解...
- **分页查询**:使用Criteria API或HQL实现分页查询,结合Page对象存储查询结果和分页信息。 3. **事务管理** - 为了保证数据的一致性,通常需要在通用DAO中处理事务。可以使用Spring的TransactionTemplate或者...
Java 分页是数据库查询和网页显示大量数据时常用的一种技术,它能有效地管理大量数据,避免一次性加载所有数据导致的性能问题和用户体验下降。在Java中实现分页主要涉及两个核心概念:偏移量(Offset)和限制大小...
在Java Web开发中,SSH(Struts2、Spring、Hibernate)框架被广泛使用,其中的分页功能是提高用户体验的重要一环。对于处理多对多关系的数据,分页显得更为复杂,因为涉及到的对象关联和集合的处理。本篇将详细阐述...
- **分页查询**:支持对查询结果进行分页处理,避免一次性加载大量数据。 #### 六、最佳实践与常见问题 - **合理设计实体类**:遵循单一职责原则,避免实体类过于臃肿。 - **正确使用缓存**:合理配置缓存策略,...
- 使用HibernateDAO时,根据`Page`对象的参数设置查询的分页信息,例如`criteria.setFirstResult(page.getFirst()-1).setMaxResults(page.getPageSize()).list();`。 - 将查询结果设置到`Page`的`result`属性,并...
例如,对于一个基于Hibernate的查询,可以这样实现: ```java public List<User> getUsers() { int pageIndex = PageParams.PAGEINDEX.get(); int pageSize = PageParams.PAGESIZE.get(); Criteria criteria =...