Oracle MySql以及Hibernate实现分页

来源:互联网 发布:swift 网络请求第三方 编辑:程序博客网 时间:2024/05/26 02:52

         大学时学习目标性不强,刚接触J2EE时,发现有太多的知识不熟悉,太多的知识需要去学习。但是在自己写Demo的时候,感觉到很多知识其实在用到的时候去网上找找就能解决,于是一个不太好的想法蒙蔽了我的双眼:不用主动去弥补自己知识的薄弱点,遇到时现学就OK了。分页,想必是一个很常用的功能,当时听同学说分页不难,于是就落下了。现在工作时遇到,决定好好记录下各常用数据库实现分页方式,没有考虑性能的问题。

1.  Oracle

Oracle通过ROWNUM实现分页,注意有三层select,end表示结束行 start表示开始行,具体代码如下:

SELECT * FROM (

         SELECT ROWNUM RN, A.* FROM (

                   SELECT* FROM table d WHERE 1=1 ) A 

                   WHERE ROWNUM <=end ) B

         WHERE RN >= start;

 

2.  MySql

         mysql实现分页是通过使用limit函数实现的,LIMIT[offset,] rows可以从MySQL数据库表中第M条记录开始检索N条记录的语句为: SELECT * FROM 表名称 LIMIT M,N,M可省略。mysql实现分页有两种不同方式,一种是使用COUNT(*)的方式,具体代码如下:

SELECT COUNT(*) FROM foo WHERE b = 1;//获得总数

SELECT a FROM foo WHERE b = 1 LIMIT 100,10;

另外一种是使用SQL_CALC_FOUND_ROWS,具体代码如下:

SELECTSQL_CALC_FOUND_ROWS a FROM foo WHERE b = 1 LIMIT 100, 10;

SELECT FOUND_ROWS();//获得总数                

从原子性来看,第二种比第一种好。第二种能保证查询语句的原子性,第一种当两个请求之间有额外的操作修改了表的时候,结果就自然是不准确的了,而第二种则不会。但是,一般页面需要进行分页显示的时候,往往并不要求分页的结果非常准确。即分页返回的total总数大1或者小1都是无所谓的,换句话说原子性不是分页关注的重点。

感兴趣的同学可以去网上查查两种方式的性能。这是网友老王的一篇分析文章:http://hi.baidu.com/thinkinginlamp/item/b122fdaea5ba23f614329b14

3.  Hibernate

Hibernate实现分页比较简单,只需调用setFirstResult()设置起始行,然后调用setMaxResults()设置获取的最大行数。

Session session =getSessionFactory().getCurrentSession();

                   Queryquery = session.createQuery(hql);

                   query.setFirstResult(start);

                   query.setMaxResults(itemsInPrePage);

 

原创粉丝点击