本来打算再过一阵子整体介绍一下个人的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的优点,同时有自己的特色,下次会完整介绍并进行开源。
相关推荐
支持多种关系型数据库,还支持NoSQL的Cassandra,Mongodb等;更快、更简单、更自动,开发速度快,运行快,更智能。一个简单,易用,功能强大(编码少、开发速度快,运行快)的 JAVA ORM 框架。Bee简单易用:单表操作...
数据库:mysql、oracle等关系型数据库 前端 dom : Jquery 分页 : jquery.pagination UI管理 : common UI集成 : uiExtend 滚动条 : jquery.nicescroll.min.js 图表 : highchats 3D图表 :highcharts-more 轮播图 :...
数据库:mysql、oracle等关系型数据库 前端 dom : Jquery 分页 : jquery.pagination UI管理 : common UI集成 : uiExtend 滚动条 : jquery.nicescroll.min.js 图表 : highcharts 3D图表 :...
为一种独特的Data Mapper,使用SQL映射的方式将对象持久化至关系型数据库。简单的理解就是它将我们在数据访问层实现的C#逻辑代码,变为通过 关系数据库与对象的映射,将SQL逻辑放到外部的XML配置文件中,以方便以后...
数据库采用常见关系型数据库 MySQL,ORM 框架是 MyBatis + MyBatis Plus。 采用 Redis 缓存数据,所有数据基本都先走 MySQL 然后走 Redis (部分分页数据和搜索数据除外)。 采用轻量级安全框架 Shiro,目前本站由三...
数据库采用常见关系型数据库 MySQL,ORM 框架是 MyBatis + MyBatis Plus。 采用 Redis 缓存数据,所有数据基本都先走 MySQL 然后走 Redis (部分分页数据和搜索数据除外)。 采用轻量级安全框架 Shiro,目前本站由三...
数据库采用常见关系型数据库 MySQL,ORM 框架是 MyBatis + MyBatis Plus。 采用 Redis 缓存数据,所有数据基本都先走 MySQL 然后走 Redis (部分分页数据和搜索数据除外)。 采用轻量级安全框架 Shiro,目前本站由三...
关系型数据库的三范式 Java面试题26.事务的四大特征 Java面试题27.mysql数据库最大连接数 Java面试题28.mysql和oracle的分页语句 Java面试题29.触发器的使用场景? Java面试题30.存储过程的优点 Java面试题31.jdbc...
由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...
面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....
两个框架都能达到它们最初的设计要求 ■两个框架都处于积极的开发状态并且它们会在未来的一段时间内完全被支持 Kohana2x和3.x的主要不同点是? 两个框架有他们自己的开发团队和日标 ■ Kohana2.x使用MC设计模式,而 ...
最新轻量级SpringBoot + MyBatis + ...数据库采用常见关系型数据库MySQL,ORM框架是MyBatis + MyBatis Plus。 采用Redis缓存数据,所有数据基本都先先MySQL然后走Redis(部分分页数据和搜索数据除外)。 采用轻量级
-- 关系型数据库整合时需配置 如hibernate jpa等 --> <groupId>org.springframework <artifactId>spring-orm <!-- Spring MVC核心 --> <groupId>org.springframework <artifactId>spring-webmvc...
使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的...
1.2.6 开源数据库服务器之骄子mysql 23 1.2.7 功能强大的flv流媒体服务器red5 24 1.3 门户网站开发指导思想 26 1.4 ssh 2组合框架—门户网站开发之首选 28 1.4.1 mvc混血宠儿struts 2 28 1.4.2 幕后的财政部长...
7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"==...
1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 2、Java有没有goto? 3、说说&和&&的区别。 4、在JAVA中如何跳出当前的多重嵌套循环? 5、switch语句能否作用在byte上,能否作用在long上...
7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"==...