`

对分页方法的一个多层的封装

 
阅读更多
//下面是对一个分页方法的封装,考虑了客户端调用的时候的多种传递参数的情况,其实在开发过程总没有必要提供那么多的接口,一切以需求为基准无论因为参数的个数或类型进行怎么的封装真正的代码实现只有一份(MyThreadLocal是一个绑定了分页数据的ThreadLocal)
/**
	 * 直传一条hql语句
	 * @param hql
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public PageModel searchEncapsulation(String hql){
		return this.searchEncapsulation(hql,null);
	}
	
	/**
	 * 如果hql中需要设置一个参数,则需要传递参数
	 * @param hql
	 * @param params
	 * @return
	 */
	public PageModel searchEncapsulation(String hql, Object params){
		return this.searchEncapsulation(hql,new Object[]{params});
	}
	
	/**
	 * 如果hql中需要设置多个参数,则需要传递参数
	 * @param hql
	 * @param params
	 * @return
	 */
	public PageModel searchEncapsulation(String hql, Object[] params){
		return this.searchEncapsulation(hql,params,MyThreadLocal.getValue().getOffset(),MyThreadLocal.getValue().getPageSize());
	}
	
	/**
	 * 如果hql中需要设置一个参数,并且你的这个方法要支持分页,要把分页需要的数据传过来
	 * @param hql
	 * @param param
	 * @param offset
	 * @param pageSize
	 * @return
	 */
	public PageModel searchEncapsulation(String hql,Object param, int offset, int pageSize){
		return this.searchEncapsulation(hql,new Object[]{param} ,MyThreadLocal.getValue().getOffset(),MyThreadLocal.getValue().getPageSize());
	}
	
	/**
	 * 如果hql语句不需要参数,但是要求支持分页
	 * @param hql
	 * @param offset
	 * @param pageSize
	 * @return
	 */
	public PageModel searchEncapsulation(String hql,int offset, int pageSize ){
		return this.searchEncapsulation(hql,null,offset, pageSize);
	}
	
	/**
	 * 最终实现:一个Service或者Interface可以向外提供过个不同的参数个数或者类别的方法,但是真正的代码实现只需要一份
	 * @param dataHql
	 * @param params
	 * @param offset
	 * @param pageSize
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public PageModel searchEncapsulation(String dataHql,Object[] params, int offset, int pageSize){
		//查询总记录数
		String countHql = getCountHql(dataHql);
		Query query = this.getSession().createQuery(countHql);
		//设置查询条件中可能会用到的参数
		if(params != null && params.length >0) {
			for(int i=0; i<params.length; i++) {
				query.setParameter(i, params[i]);
			}
		}
		int total = ((Long)query.uniqueResult()).intValue();
		List<Organization> datas = this.getSession().createQuery(dataHql)
										.setFirstResult(offset)
										.setMaxResults(pageSize)
										.list();
		PageModel pm = new PageModel();
		pm.setTotal(total);
		pm.setDatas(datas);
		//查询数据
		return pm;
	}
	
	public String getCountHql(String hql) {
               //这个地方有个小bug,没有考虑到From大小写的问题
		int index = hql.indexOf("from");
		if(index != -1) {
			hql = "select count(*) " + hql.substring(index);
			return hql;
		}
		throw new RuntimeException();
	}
0
1
分享到:
评论

相关推荐

    c# net 分页源码 多层

    在.NET开发中,分页是数据管理中一个非常重要的功能,尤其是在处理大量数据时,它能够提高用户体验并优化系统性能。C#与.NET框架结合,提供了多种实现分页的方法。本压缩包中的“多层”分页源码,可能是为了处理复杂...

    MVC多层分页演示程序源码

    【标题】"MVC多层分页演示程序源码"是一个.NET MVC框架下实现的多层分页功能的示例项目。在这个项目中,开发者可以深入理解如何在MVC架构中实现高效的数据分页,这对于处理大数据量的Web应用程序至关重要。 MVC...

    MVC_demo.rar_DEMO_MVC de_MVC分页_mvc demo_多层 java

    在这个"MVC_demo"压缩包中,我们可以看到一个基于Java的多层架构的MVC示例项目,非常适合用于学习J2EE平台上的MVC应用开发。 **1. Model层**:这是模型层,主要负责处理业务逻辑和数据操作。在提供的文件中,我们...

    J2EE登陆和分页

    为了提高代码复用性和可维护性,通常我们会封装这些通用功能,比如创建一个名为`DatabaseAccessUtil`的工具类,包含连接数据库、执行SQL、处理结果集等方法。对于分页,可以设计一个`Pagination`类,包含当前页、总...

    HibernateSpringStruts2整合开发中的一个分页显示方案.doc

    本篇文章将详细介绍如何在SSH整合开发中实现一个分页显示方案。 首先,我们需要在DAO层设计分页查询的相关接口。在`MemberDao`接口中,定义了两个关键方法:`queryForPage`用于执行分页查询,`getAllRowCount`用于...

    jdbc+jsp分页组件+源代码

    总的来说,"jdbc+jsp分页组件+源代码"是关于如何在Java Web项目中利用JDBC进行数据库操作,并结合JSP实现前端分页展示的一个实践案例。通过学习这个案例,开发者可以深入理解JDBC和JSP在实际项目中的应用,以及如何...

    多层结构会员管理系统源码

    总的来说,这个源码包提供了一个完整的会员管理系统,开发者可以通过学习和分析这些代码,提升对Asp.Net开发、多层架构设计以及会员权限管理的理解。同时,源码的开放性也使得开发者可以在此基础上进行定制化开发,...

    asp.net(c#)多层分布式架构实例源码

    分页那里还有点bug,不过我想以后再改进了(分页封装到数据层我总觉得不好),前台部分没有用控件(貌似一个高手告诉我,如果哪天你做.net不用控件了,你就可以了,汗一下!我就索性试一试。^_^)。有什么不合理的...

    博客源码,采用三层/多层模式开发

    这是一个基于ASP.NET技术开发的博客系统源码,其核心架构采用了经典的三层或称为多层架构设计,这种设计模式是软件工程中常见的结构,旨在提高代码的可维护性和可复用性。三层架构通常包括表现层(UI)、业务逻辑层...

    LINQ to SQL创建三层多层Web应用系统

    这些方法应该封装对LINQ to SQL的直接调用,确保业务逻辑与数据访问分离。 3. **数据访问层**:在数据访问层,使用LINQ to SQL的DataContext对象进行数据库操作。例如,添加、删除、更新和查询数据。DataContext...

    Vs2005下GridView演示多层Demo源码.rar

    【标题】"Vs2005下GridView演示多层Demo源码"是一个关于在Visual Studio 2005(简称Vs2005)环境中使用ASP.NET GridView控件实现多层数据展示的示例项目。GridView是ASP.NET Web Forms中的一个强大控件,常用于在...

    j2ee用户登录代码

    2. **模拟保存用户方法**:`saveUsr` 方法接收一个`Usr` 对象,开启事务,然后调用`session.save()` 方法将用户对象持久化到数据库。如果保存成功,提交事务并返回用户对象;如果出现异常,回滚事务并返回null,最后...

    vuedatatablesVueJS2数据表格

    7. **单文件组件(Single File Component,SFC)**:Vue.js 2.0引入的SFC模式,将模板、脚本和样式都封装在一个.vue文件中,提高了代码的组织性和可读性。在`vuedatatables`项目中,每个组件可能都是一个SFC。 8. *...

    Data Source Controls in ASP.NET 2.0

    在ASP.NET 2.0中,这些代码可以显著减少,从而创建一个带有完整分页、排序和编辑功能的数据填充网格。 SqlDataSource是ASP.NET 2.0中的一个重要组件,它使得与数据库交互变得极其简单。你可以直接在Web应用程序中...

    Java工程师个人求职简历(全文).docx

    首先,他参与了一个Web OA(企业办公自动化系统)的开发,这是一个涵盖多种功能的企业协作平台,包括机构管理、权限控制、公文流转等。项目采用了MyEclipse作为开发工具,Oracle作为数据库,Tomcat作为应用服务器,...

    java软件工程师简历.docx

    Web OA 项目是企业办公自动化系统,旨在为企业提供一个能相互合作,提高工作效率的平台,实现企业的无纸化和协同办公。该项目使用 MyEclipse + Oracle + Tomcat 开发环境,采用 Struts+Hibernate+Spring 的多层架构...

    基于JavaEE的音乐检索系统_JSP网站设计_SqlServer数据库设计.rar

    3. **DAO(Data Access Object)模式**:创建一个接口层,用于封装数据库操作,解耦业务逻辑和数据访问。 4. **Session和Cookie管理**:用于跟踪用户的会话状态,例如存储用户登录信息。 5. **安全性**:可能涉及到...

    ASP.NET会员管理系统C# 源代码

    "Dal"(Data Access Layer,数据访问层)是系统与数据库交互的接口,封装了SQL语句,实现了对数据的增删改查操作。在这里,开发者可能会找到ADO.NET对象如SqlConnection、SqlCommand等的使用示例。 "Bll"(Business...

Global site tag (gtag.js) - Google Analytics