不同数据库的分页查询语句有着较大区别,其中MySQL数据的limit offset语法最为简单,而SQL Server数据库和Oracle数据库的分页就比较复杂了。

网上常见的SQL Server和Oracle数据库的分页语句都或多或少对表结构有要求,比如必须有递增的主键ID等。

当我们不能确定所连查询数据表的表结构(比如表是客户动态提供的)时,如何以一种通用且高效的方式在不同数据库上实现分页查询功能呢?

解决方案1:使用JDBC的通用分页功能

第一步:利用java.sql.Statement#setMaxRows方法,设置本次查询的最大记录数。

第二步:查询结束后,利用java.sql.ResultSet#absolute方法,跳过前面不属于查询页的记录。

这种方法的优点是简单通用。它的缺点也很明显,就是性能问题,比如查询最后一页数据时,JDBC实现原理是先查出所有数据,然后跳过前面页的数据,性能损伤很大。

如果你确定你所处的业务场景,用户通常只会触发前几页的查询(比如搜索场景:如果前几页没有自己想要的东西,通常是缩小查询范围重新搜索,而不是逐页往后去查找),那么这种简单且通用的方法不失为一种性价比较高的选择。

解决方案2:使用各类数据库的通用分页SQL语句

这是Hibernate的解决思路,由于最终将向数据库发送的是数据库相关的特定分页SQL语句,数据库有充分的信息进行优化,且最终只返回一页的记录。

现在问题的关键在于各类数据库的通用(对表结构没有限制)分页查询语句格式是怎样的呢?

下面将一一介绍。

注:为了便于举例,下面的SQL语句均实现的是查询一张名为test表中的column1、column2、column3字段的值,查询时设置了基于column1的过滤条件,同时可选是否基于column1排序。column1、column2、colum3没有任何特殊性,读者可以将下述SQL格式套用在任何表结构上,同时可以丰富过滤条件。

MySQL/MariaDB数据库(不排序)

SELECT column1, column2, column3 FROM test WHERE column1 = ? LIMIT 1000 OFFSET 0

MySQL/MariaDB数据库(排序)

SELECT column1, column2, column3 FROM test WHERE column1 = ? ORDER BY column1 ASC LIMIT 1000 OFFSET 0

SQL Server数据库(不排序)

SELECT column1, column2, column3 FROM (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS ROWNUM,* FROM test WHERE column1 = ?)t WHERE t.ROWNUM > 0 AND t.ROWNUM <= 1000

SQL Server数据库(排序)

SELECT column1, column2, column3 FROM (SELECT ROW_NUMBER() OVER ( ORDER BY column1 ASC) AS ROWNUM,* FROM test WHERE column1 = ?)t WHERE t.ROWNUM > 0 AND t.ROWNUM <= 1000

Oracle/达梦数据库(不排序)

SELECT column1, column2, column3 FROM (SELECT ROWNUM RN,t.* FROM (SELECT * FROM test WHERE column1 = ?)t WHERE ROWNUM <= 1000) WHERE RN > 0

Oracle/达梦数据库(排序)

SELECT column1, column2, column3 FROM (SELECT ROWNUM RN,t.* FROM (SELECT * FROM test WHERE column1 = ? ORDER BY column1 ASC)t WHERE ROWNUM <= 1000) WHERE RN > 0

这种方法的优点是效率高,缺点是需要学习不同种类的数据库的通用分页SQL语句格式。

希望本文总结的这几种常见数据库的通用分页SQL格式能够覆盖你的需求,为你带来帮助。

用Java实现异构数据库的高效通用分页查询功能的更多相关文章

  1. 利用EF和C#泛型实现通用分页查询

    利用EF和C#泛型实现通用分页查询       Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (ORM) 解决方案,是微软的ORM框架.此框架将数据库中的 ...

  2. Oracle 存储过程之通用分页查询

    在数据库中书写通用分页存储过程,有利于代码的维护以及执行效率的提升 create or replace procedure Sp_QueryDatePage ( tableName in varcha ...

  3. 防SQL注入:生成参数化的通用分页查询语句

    原文:防SQL注入:生成参数化的通用分页查询语句 前些时间看了玉开兄的“如此高效通用的分页存储过程是带有sql注入漏洞的”这篇文章,才突然想起某个项目也是使用了累似的通用分页存储过程.使用这种通用的存 ...

  4. sqlsever 创建一个通用分页查询

    -- Author: Mis Chen-- Create date: 2018年5月15日 11:21:47-- Description: 创建一个通用分页查询-- ================= ...

  5. html(四)数据库curd操作与分页查询

    数据库操作curd : 1.首先要建立项目处理好自己逻辑包: 其中util工具包中建立两个工具类 jdbc连接和page分页 DBUtil.java: db工具类就是用于连接数据库的jdbc架包,里面 ...

  6. .net使用SqlBulkCopy类操作DataTable批量插入数据库数据,然后分页查询坑

    在使用SqlBulkCopy类操作DataTable批量插入数据,这种操作插入数据的效率很高,就会导致每一条数据在保存的时间基本一样,在我们分页查询添加的数据是,使用数据的添加时间来排序就会出现每页的 ...

  7. sql分页查询(2005以后的数据库)和access分页查询

    sql分页查询: select * from ( select ROW_NUMBER() over(order by 排序条件) as rowNumber,* from [表名] where 条件 ) ...

  8. 异构数据库迁移——DATAX

    背景 在最近接触到的一个case里面,需要把db2的数据迁移至oracle,客户可接收的停机时间为3小时. 同步方式的比较 一说到停机时间,大家第一时间想到Oracle公司的GoldenGate实时同 ...

  9. SQL Server 2008 通用分页存储过程

    1.alert USE [数据库名称] GO /****** Object: StoredProcedure [dbo].[dbTab_PagerHelper] Script Date: 08/22/ ...

随机推荐

  1. java中byte数组与int,long,short间的转换

    http://blog.csdn.net/leetcworks/article/details/7390731 package com.util; /** * * <ul> * <l ...

  2. Python 7 多线程及进程

    进程与线程: 进程的概念: 1.程序的执行实例称为进程. 2.每个进程都提供执行程序所需的资源.一个进程有一个虚拟地址空间.可执行代码.对系统对象的开放句柄.一个安全上下文.一个独特的进程标识符.环境 ...

  3. java多线程笔记

    一,线程的状态 1,新建状态:新创建了一个线程对象 2,就绪状态:线程创建对象后,线程调用star()的方法,等待获取CPU的使用权. 3,运行状态:获取了cpu的使用权,执行程序代码 4,阻塞状态: ...

  4. 011_Eclipse中使用HDFSFileSystemAPI事例介绍

    需求 1.文件操作 1)上传本地文件到HDFS 2)读取文件 3)在hadoopfs中新建文件,并写入 4)重命名文件 5)删除hadoopfs上的文件 2.目录操作 1)读取某个目录下的所有文件 2 ...

  5. Linux基本命令 压缩命令

    1.压缩命令 ================================================================================== 命令名称:gzip ...

  6. Java final static关键字

    Java中的final关键字 使用 final 关键字做标识有 “最终的” 含义. final 可以修饰 类.方法.属性.变量 final 修饰类: 则该类不允许被继承 final 修饰方法:则该方法 ...

  7. ibecon后台运行

    程序被硬关闭后,只能执行这三个回调,而且必须写在appdelegate中,退出ibeacons信息区域时会有延时10秒左右,进入时无延时 - (void)locationManager:(CLLoca ...

  8. 常用java开发工具快捷键

    在这里列举一些开发中常用的快捷键 常用的idea的快捷键: 1.删除当前行:Ctrl+X 2.格式化代码:Ctrl+Alt+L 3.查看本页里面的内容:Ctrl+F 4.查看类的继承方式:Ctrl+H ...

  9. SolrCloud 5.5.5 + Zookeeper + HDFS使用

    安装sol r 三个节点192.168.1.231,192.168.1.234,192.168.1.235 下载安装包solr.tar.gz 解压 tar -zxvf solr.tar.gz 配置ZK ...

  10. 【转】Android PullToRefresh (ListView GridView 下拉刷新) 使用详解

    最近项目用到下拉刷新,上来加载更多,这里对PullToRefresh这控件进行了解和使用. 以下内容转载自:http://blog.csdn.net/lmj623565791/article/deta ...