`
jiaxiao1123
  • 浏览: 1039 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

通过json实现复杂sql结果集分页

阅读更多
刚进入一个大型项目,框架用的是ext+ajax+spring+hibernate。
但是由于业务逻辑复杂,经常出现列表查询需要同时用到多个表的情况。
由于表关系复杂,使用hibernate开发会对组内开发进度造成较大影响。

针对此类情况,我封装了一套方法给组内调用。原理是通过ResultSetMetaData类获取结果列的名称生成JSONArray字符串,返回给页面调用。

dao层代码如下:
// start,pageSize分别为页面传过来的值,此值不需要开发人员自己设置。
public static String getPageJson(String sql,int start,int pageSize){
		JSONObject obj = new JSONObject();
		JSONArray array = new JSONArray();
		Connection conn = null;
		PreparedStatement pstms2 = null;
		ResultSet rs = null;
		String sql1 = "select count(*) ";
		try {
			
			sql1+=sql.substring(sql.indexOf("from"));
			conn = dataSource.getConnection();
			pstms2 = conn.prepareStatement(sql1);
			rs = pstms2.executeQuery();
			int count=0;//count为结果集总数
			while (rs.next()) {
				count = rs.getInt(1);
				obj.put("count", count);
			}			
			int end = start+pageSize>count?count:start+pageSize;
			int begin = start;
			if (begin>count){
			}else{
				String str = "select * from (select A.* , ROWNUM RN  from ("+sql+")A where rownum<=" + end+") where RN>="+begin;//拼接分页sql
				pstms2 = conn.prepareStatement(str);
				rs = pstms2.executeQuery();
				ResultSetMetaData md = rs.getMetaData();
				int cols = md.getColumnCount();
				while (rs.next()) {
					JSONObject obj1 = new JSONObject();
				for (int i = 1; i <= cols; i++) {
					if (md.getColumnType(i)==Types.NULL){
						obj1.put(md.getColumnName(i), "");
					}else if (md.getColumnType(i)==Types.DATE){
						if (null!=rs.getDate(i)) {
					obj1.put(md.getColumnName(i),               EsUtil.getStrDateYMD(rs.getDate(i)));//将date类型转换成正确格式
						}
					}else{
						if (md.getColumnName(i)!="RN"&&!"RN".equals(md.getColumnName(i))){
							obj1.put(md.getColumnName(i), rs.getString(i)==null?"":rs.getString(i));
//将除date类型以及null的返回值写入json。如为非string类型会被自动转化为String类型
						}
					}
				}
				array.put(obj1);
			}
			obj.put("list", array);
			}
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				if (conn != null)
					conn.close();
				if (pstms2 != null)
					pstms2.close();
				if (rs != null)
					rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		return obj.toString();
	}


返回值应为{'list':[...],'count',n}。
页面是我封装的ext分页方法。将store、pagingtoolbar封装到grid中。对于开发者,只要在grid中写入sql中的别名和dataIndex的值对应,并写入调用相关属性。调用时,就会将查询参数以及分页参数传到后台,由开发者自己根据传入查询条件拼装sql调用。

感觉上性能肯定有优化的余地,bug也是必然存在的。比如如果sql语句中如count(*)无别名,则会报错。

欢迎大家探讨和指正。
分享到:
评论

相关推荐

    EXT JSON Sqlserver 分页 全部正常运行

    5. 示例的实现流程:用户在EXT JS的Grid中触发分页操作,请求发送到JSP页面,JSP调用JavaBean执行SQL查询,获取指定范围的数据,将结果集转化为JSON,最后返回给EXT JS应用,更新Grid显示。 这个例子涵盖了前端开发...

    SQL自动生成JSON数据.docx

    在SQL Server中,可以使用WITH子句和ROW_NUMBER()函数来实现分页查询,并将查询结果转换为JSON数据。 首先,需要声明变量@TableName、@sql、@CurPageFirstRow、@CurPageLastRow和@OrderByColumn,分别用于存储表名...

    JsonSql-master.zip

    在JavaScript环境中,这通常是通过遍历整个数据结构来实现,而JsonSql.js提供了一种更高效、更灵活的方法。 2. **Json数据处理**:JsonSql.js特别适合处理JSON格式的数据,因为JSON是现代Web应用中常用的数据交换...

    .NET利用jqury+ajax+json方式实现的数据分页

    通过以上步骤,你可以在.NET环境中利用jQuery、Ajax和JSON实现数据分页。这种方式不仅提高了用户体验,也简化了前后端的交互。在实际项目中,可能还需要考虑错误处理、性能优化(如使用缓存)和兼容性问题,但基本...

    不妨看看我用dwr和json完成简单分页-jsp dwr分页(mssqlserver2005)

    在本例中,服务器端通过DWR调用执行SQL查询后,会将结果集转化为JSON格式,然后发送到客户端。JavaScript可以轻易解析这些JSON数据,并用于动态更新页面上的分页内容。 对于分页功能,通常需要以下几个关键步骤: 1...

    asp.net+jquery+json+分页

    在本项目中,服务器端的ASP.NET使用C#(可能是`Default.aspx.cs`和`Default2.aspx.cs`中的代码)处理数据查询和分页逻辑,然后将结果转换成JSON格式发送回客户端。 `Handler2.ashx`是一个HTTP处理器,也称为ASHX...

    struts2 spring2 ibatis2 jquery json 页面无刷新分页

    开发者可以通过动态SQL来轻松地调整分页查询,例如设置LIMIT和OFFSET子句来实现数据库分页。 **jQuery**:jQuery 是一个流行的JavaScript库,简化了DOM操作、事件处理和Ajax交互。在页面无刷新分页中,jQuery 用于...

    spring+Mybatis+ PageHelper实现分页

    8. **Controller层**:在Controller层,将PageInfo对象转换成JSON或者视图模型,传递给前端展示分页结果。 以上就是使用Spring、Mybatis和PageHelper实现分页的基本步骤。通过这种方式,我们可以轻松地在项目中实现...

    jquery+json 无刷新分页

    通过以上步骤,你可以利用jQuery和JSON在VS2008和SQL2000环境中构建一个高效的无刷新分页系统。这个技术不仅可以提升用户体验,还能减少服务器负载,是现代Web应用的必备特性之一。在实际项目中,可以根据需求进行...

    dwr + json简单分页

    3. **实现服务接口**:在后台实现`PageService`接口,执行SQL查询并返回分页结果。 ```java @Service public class PageServiceImpl implements PageService { @Override public List&lt;DataObject&gt; getPage(int ...

    jsp+servlet+json分页

    开发者可能会实现`doGet()`或`doPost()`方法来处理请求,通过SQL查询获取所需分页数据,然后将其转换为JSON格式。 **3. JSON (JavaScript Object Notation)** JSON是一种轻量级的数据交换格式,易于人阅读和编写,...

    sqlserver海量数据TOP分页

    Servlet则负责接收前端请求,传递分页参数(如当前页和每页大小),调用上述JDBC代码获取数据,并将结果集转化为前端可展示的格式,最后返回给客户端。例如: ```java protected void doPost(HttpServletRequest ...

    Go-jsonapi-用于实现Go数据与JSONAPI格式相互转换

    4. **分页**:通过链接(links)和元数据(meta)来支持分页。 5. **错误处理**:标准的错误响应格式。 ## `go-jsonapi`简介 `go-jsonapi`是针对Go语言的一个库,实现了JSONAPI规范,使得Go开发者可以方便地将Go的...

    Asp.net+Sql+ashx实现 jquery无刷新分页

    总结,通过Asp.net、SQL和ASHX处理程序的结合,我们可以轻松实现jQuery无刷新分页,为用户提供流畅的浏览体验。而"jquery无刷新分页"文件可能包含的就是实现这一功能的具体代码示例,包括服务器端的ASHX处理程序和...

    强大的AJAX+JSON+ashx无刷新分页源码

    3. **ASHX处理**:服务器上的ASHX文件接收到请求,根据请求参数处理数据库查询,如SQL分页查询,获取指定页的数据。 4. **JSON响应**:服务器将查询结果转换成JSON格式,并返回给前端。 5. **前端更新**:前端接收到...

    php加载和生成json和生成xml文件,并带有ajax分页效果,带图带数据库

    本文将深入探讨如何使用PHP加载和生成JSON以及XML文件,并结合AJAX实现分页效果,同时结合数据库和图片资源。 首先,让我们了解JSON(JavaScript Object Notation)和XML(Extensible Markup Language)。两者都是...

    .net JSON+ajax 分页

    标题中的".net JSON+ajax 分页"涉及到的是在.NET框架下,使用JSON数据格式和Ajax技术来实现网页的动态分页功能。这是一个常见的Web开发需求,尤其是在数据量较大的情况下,为了提高用户体验,避免每次操作都刷新整个...

    java分页的简单实现

    3. **执行分页查询**:使用上述步骤中的JDBC方法执行SQL并处理结果集。 4. **将结果转化为响应**:将查询结果转化为合适的格式,如JSON,然后通过HttpServletResponse对象发送给客户端。 5. **处理错误**:在可能...

    django执行数据库查询之后实现返回的结果集转json

    在Django框架中,数据库查询后的结果集通常是一个QuerySet对象,它包含了多个模型实例。当需要将这些数据传递给前端,例如以JSON格式展示时,需要进行一些处理。本文将详细介绍如何在Django中将数据库查询结果转换为...

Global site tag (gtag.js) - Google Analytics