`
zhongxuchen
  • 浏览: 33321 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Sqltoy ORM框架之:分页查询(没错包含你所有所有能用到的关系型数据库分页)

 
阅读更多

      本来打算再过一阵子整体介绍一下个人的Sqltoy ORM框架,但经历几家公司,发觉在数据库操作层面,就算是很大的公司仍然在使用非常古老的做法,为了给大家一点建议,分享一下有关数据库分页的做法。

     1、数据库分页一般分两步,第一:取总记录数,第二:根据页号和总记录数以及每页条数封装特定数据库分页查询语句。

     2、针对普通开发者,应该提供一个统一的分页封装,将取记录数和取分页记录进行有效封装,让开发者只需要一步操作即可完成分页查询,这里一般需要封装一个paginationModel,里面有pageNo,pageSize,rows<List>,totalRecord等属性。

     分页应该充分考虑性能问题,其关键点:

1、提取查询记录数的sql,一般要截取 from 前部分,组成 select count(1) from xxxxx,同时需要剔除掉 整个sql中的 group by 以及order by ,这样有助于提升sql执行性能

2、需要考虑sql语句中存在 with xxx as () 模式的语句,大多数公司的框架根本就没有考虑这种问题,导致sql一旦比较特殊查询就报错。 

      这里个人提供一下各类数据库的分页机制:

1、mysql:select * from xx   limit :start,:pageSize

2、oracle12c和sqlserver2012:select * from xxx  offset ? rows fetch next ? rows only 

3、oracle11g以及之前,分两种情况

    A:排序:SELECT * FROM (SELECT ROWNUM page_row_id,SAG_Paginationtable.* FROM (rejectWithAsSql这括号里就是你写的sql ) SAG_Paginationtable  ) WHERE  page_row_id<=? and page_row_id >?

    B:不排序:SELECT * FROM (SELECT ROWNUM page_row_id,SAG_Paginationtable.* FROM   (rejectWithAsSql这括号里就是你写的sql ) SAG_Paginationtable where ROWNUM <=?  ) WHERE  page_row_id >?

4、sqlserver2012之前的版本

    SELECT sag_sqlserver_tmp.*
   FROM (SELECT ROW_NUMBER() OVER(order by tempColumn) as page_row_id,SAG_Paginationtable.*
   FROM ( select top 40 tempColumn=0,* from rejectWithAsSql ) SAG_Paginationtable ) sag_sqlserver_tmp
where sag_sqlserver_tmp.page_row_id >?

   sqlserver第一个top 地方不可以用?形式,必须用数字替代进去。

   (当然sqlserver的处理还需要考虑是否union查询,如果是union则必须将整个查询语句包裹起来增加select  * from(你的unionsql) as xxx)

5、db2:

   SELECT t_sag_pageTable.* FROM
        (SELECT rownumber() over() as page_row_id,SAG_Paginationtable.*
         FROM (rejectWithAsSql:你的sql语句被裹在这里 ) SAG_Paginationtable ) t_sag_pageTable where t_sag_pageTable.page_row_id <=? and t_sag_pageTable.page_row_id >?

6、informix:

   SELECT SKIP ? FIRST ?  SAG_Paginationtable.* FROM (rejectWithSql) SAG_Paginationtable

7、POSTGRESQL和sqlite

    select * from xxxtable limit ? offset ?

8、sybase ASE

   sybase得通过临时表,比较变态一点,但一定要注意方式(临时表的名字建议用"#SAG_TMP_" + System.nanoTime()来组成),一定先用top提取部分数据插入临时表,避免全量查询插入临时表

   select top ? page_row_id=identity(12),sag_tmp_table.* into #tmptable from (你的sql) sag_tmp_table

9、sybase iq:

    类似于ASE,但注sql中的 order by,IQ子查询中不支持order by,需要将order by 提取到外边

 

   当然分页过程中有些数据库需要注意一些细节,以sybase 为例首先分简单sql和复杂sql,简单sql其实就不需要变成select * from (你的sql) into #table 这种模式,可以直接select top ?,* from xxx into #tmp,即在你得sql查询部分剔除select 换成select top ? ,

    短短这些应该无法全部表达需要注意的点和优化的地方,主要是给大家点建议。要完整的实现各类数据库的有效分页机制,确实需要大量的项目实践,sqltoy经历了无数项目,也经历了几乎所有能用到的关系型数据库,有意的去发展才收集了这些问题的解决机制。

     当然sqltoy的特性并不是简单的强调分页,它已经成为一个完整的O/R Mapping解决机制,集mybatis和hibernate的优点,同时有自己的特色,下次会完整介绍并进行开源。

 

    

    

分享到:
评论

相关推荐

    hibernate分页查询 数据库连接

    Hibernate作为一种流行的Java对象关系映射(ORM)框架,极大地简化了Java开发者与数据库的交互。本篇将深入探讨Hibernate中的分页查询功能以及它如何处理数据库连接,帮助你更有效地管理大数据量的查询操作。 首先...

    ssh框架实现的分页代码

    7. **优化考虑**:为了提升用户体验和性能,分页功能通常会配合缓存策略,比如使用EHCache缓存部分页面结果,减少不必要的数据库查询。另外,分页参数的安全性也不容忽视,防止SQL注入攻击。 8. **测试与调试**:...

    数据库持久化 ORM 开发框架

    综上所述,ORM开发框架为开发人员提供了便利的数据库操作手段,通过对象化的方式简化了与数据库的交互,支持多种数据库系统,利用Linq进行高效查询,具备快速分页功能,并且具备完善的事务处理机制。在实际项目中,...

    ASP.NET 自已封装的ORM 框架版本2

    要使用这个ORM框架,开发者需要了解其API设计,包括如何创建数据库连接,如何定义数据模型,如何执行查询,以及如何进行数据的CRUD(Create, Read, Update, Delete)操作。此外,对于多表查询和分页,还需要学习如何...

    SSH 分页查询 mysql数据库

    在MySQL这样的关系型数据库中,分页查询可以有效提高用户体验,减少服务器负担,特别是处理大量数据时。 在SSH框架中实现MySQL的分页查询,通常涉及以下步骤: 1. **Struts配置**:首先,需要在Struts的Action类中...

    ssh框架的java分页代码

    SSH框架集成了MVC设计模式、对象关系映射(ORM)以及依赖注入(DI)和面向切面编程(AOP)。在本教程中,我们将重点讨论如何在SSH框架中实现分页功能。 分页是大型数据集显示的关键特性,它允许用户逐步浏览大量...

    asp.net版的ORM框架(原创)

    ASP.NET版的ORM框架是一种对象关系映射(Object-Relational Mapping)工具,它允许开发者使用面向对象的方式来操作数据库,而无需关注底层SQL语句的编写。在这个原创框架中,作者模仿了Hibernate的设计思想,旨在...

    互联网新时代的Java ORM框架

    支持多种关系型数据库,还支持NoSQL的Cassandra,Mongodb等;更快、更简单、更自动,开发速度快,运行快,更智能。一个简单,易用,功能强大(编码少、开发速度快,运行快)的 JAVA ORM 框架。Bee简单易用:单表操作...

    mysql和node.js整合学习,其中有 squence 和 node.js的orm框架,两个 orm框架的学习.zip

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,而Node.js则是一个基于Chrome V8引擎的JavaScript运行环境,用于构建高性能的网络应用。在这个“mysql和node.js整合学习”资料中,我们将探讨如何将这两种技术...

    EzeOrm纯手撸的一套简易javaorm框架。暂只支持mysql。

    MySQL是一种广泛使用的开源关系型数据库管理系统,以其高效、稳定和易于管理而闻名,因此EzeOrm选择支持MySQL,可以满足许多开发者的实际需求。 在使用EzeOrm时,开发者需要定义实体类,这些类将对应数据库中的表。...

    SSH框架+SQLServer实现分页的小项目

    SQLServer是由Microsoft开发的关系型数据库管理系统,广泛应用于企业级数据存储。在本项目中,数据库连接信息需要修改,以适应不同的SQLServer实例。分页查询通常需要编写SQL语句,利用`TOP`(在SQLServer中)或其他...

    基于SQL的分页查询功能,很强大的哦

    SQL(Structured Query Language)作为标准的关系型数据库查询语言,提供了丰富的功能来帮助我们有效地查询和管理数据。本话题将深入探讨如何利用SQL进行分页查询,以及如何在.NET环境中优化这种查询,以实现高效的...

    java ssm内容管理系统

    数据库:mysql、oracle等关系型数据库 前端 dom : Jquery 分页 : jquery.pagination UI管理 : common UI集成 : uiExtend 滚动条 : jquery.nicescroll.min.js 图表 : highchats 3D图表 :highcharts-more 轮播图 :...

    Morphia一个nosql的ORM框架

    NoSQL,意为“非关系型数据库”,它提供了一种不同于传统SQL的关系数据库模型,支持大规模数据存储和处理,特别适合于大数据和实时应用。 **2. Morphia的基本概念** - **实体(Entities)**: 在Morphia中,实体是...

    JAVA分页MYSQL数据库

    6. **分页查询**:分页是数据库查询的一种优化策略,通过限制每次查询的数据量,减少一次性加载的数据,提高页面加载速度。在JDBC(Java Database Connectivity)中,可以通过设置SQL的LIMIT和OFFSET关键字来实现...

    java数据库框架技术研究

    为了解决这个问题,开发者开始寻找或创建更强大的数据持久化解决方案,例如Hibernate,它是一个对象关系映射(ORM)框架,能够将Java对象与数据库表进行映射,极大地简化了数据库操作。 在本文的研究中,我们假设...

    hibernate分页查询

    Hibernate,作为一个流行的Java对象关系映射(ORM)框架,为开发者提供了便捷的分页查询功能。让我们深入探讨Hibernate分页查询的相关知识点。 一、Hibernate分页原理 Hibernate分页查询基于SQL的LIMIT和OFFSET子句...

    匹配实体类的实现了大部分功能分页 网页分页

    在分页查询时,我们可以创建一个实体类,例如`PageItem`,包含所有需要展示的字段,然后将数据库查询的结果转换为`PageItem`对象的集合。 4. 数据库MySQL: MySQL是一个流行的开源关系型数据库管理系统,它支持...

    毕业设计jsp+Sturts+hibernate的添删改查以及分页!采用Oracle数据库

    6. **Oracle数据库**:Oracle是企业级的关系型数据库管理系统,以其高性能和稳定性著称。在这个新闻管理系统中,Oracle存储所有的新闻记录,并通过Hibernate提供的API进行数据操作。开发者需要编写合适的SQL查询和...

Global site tag (gtag.js) - Google Analytics