首页 > 编程知识 正文

mysql分页实现代码(mysql 分页语句)

时间:2023-12-24 12:05:46 阅读:320898 作者:CXIH

本文目录一览:

MySql中查询语句实现分页功能

pageNow代表当前页面,第一页。

第一部分:看一下分页的基本原理:

对上面的mysql语句说明:limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。

第二部分:根据雅虎的几位工程师带来了一篇Efficient Pagination Using MySQL的报告内容扩展:在文中提到一种clue的做法,给翻页提供一些线索,比如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是1020,最小的是1000,如果我们只提供上一页、下一页这样的跳转(不提供到第N页的跳转),那么在处理上一页的时候SQL语句可以是:

处理下一页的时候SQL语句可以是:

不管翻多少页,每次查询只扫描20行。

缺点是只能提供上一页、下一页的链接形式,但是我们的产品经理非常喜欢“上一页 1 2 3 4 5 6 7 8 9 下一页”这样的链接方式,怎么办呢?

如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的clue做法,还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是2519,最小的是2500;

当是第10页的SQL如下:

比如要跳到第9页,SQL语句可以这样写:

比如要跳到第8页,SQL语句可以这样写:

原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。

怎样用mysql语句实现分页

--1.最常用的分页select * from content order by id desc limit 0, 10;--limit是MySQL中特有的分页语法,用法如下:--举例:select * from tableName limit 5; --返回前5行select * from tableName limit 0,5; --同上,返回前5行select * from tableName limit 5,10; --返回6-15行

新手怎么以最简单的方式实现jsp+mysql分页

刚开始弄 ,目前分页是在前台jsp中实现的 与bean相比 这样比较容易一些

先把代码贴出来 正在研究怎么样用bean实现分页 等弄好了 再贴代码

下面说下分页理论 select * from message order by time desc limit begin,size

begin 数据记录从第几条开始 begin=(当前页数-1)*size

size 每页的记录数

下面是连接数据库的javabean;

1: package bean;

2: import java.sql.*;

3:

4: public class MyDb{

5: private Statement stmt;

6: private Connection conn=null;

7: private ResultSet rs=null;

8:

9: public void connection(String db_name,String user,String pwd) throws Exception{

10: Class.forName("com.mysql.jdbc.Driver");

11: String url="jdbc:mysql://localhost:3306/" + db_name;

12: conn=DriverManager.getConnection(url,user,pwd);

13: stmt=conn.createStatement();

14: }

15:

16: public ResultSet query(String sql) throws Exception{

17: rs=stmt.executeQuery(sql);

18: return rs;

19: }

20:

21: public ResultSet query(String sql,int begin,int size) throws Exception{

22: String s=" limit " + begin + "," +size;

23: sql=sql + s;

24: rs=stmt.executeQuery(sql);

25: return rs;

26: }

27:

28:

29: public int update(String sql) throws Exception{

30: int n=0;

31: n=stmt.executeUpdate(sql);

32: return n;

33: }

34:

35: public boolean delete(String sql) throws Exception{

36: 0ff"boolean flag=false;

37: flag=stmt.execute(sql);

38: return flag;

39: }

40: }

下面是jsp的代码;

1: jsp:useBean id="db" class="bean.MyDb" scope="page" /

2: %

3: int page_count; //总页数

4: int p; //当前面号

5: int size=3; //每页记录数

6: int result_count; //总记录数

7: int begin; //当前页第一条记录索引号

8: ResultSet rs=null;

9: String page_s=request.getParameter("page");

10: if(page_s==null) page_s="1";

11: db.connection("test","root","root");

12: String sql="select count(*) from message";

13: rs=db.query(sql);

14: rs.next();

15: result_count=rs.getInt(1);

16: page_count=(result_count + size - 1)/size;

17: p=Integer.parseInt(page_s);

18: out.println("总记录数为:" + result_count + " 每页记录数为:" + size + " 总页数为:" + page_count + " 当前是第" + p + "页");

19: sql="select * from message order by time desc";

20: begin=(p-1)*size;

21: rs=db.query(sql,begin,size);

22: while(rs.next()){

23: %

24: table

25: tr

26: td width="200"%=rs.getString(1)%/td

27: td width="200"%=rs.getString(2)%/td

28: /tr

29: tr

30: td%=rs.getString(3)%/td

31: td%=rs.getString(4)%/td

32: /tr

33: trtd colspan="2"%=rs.getString(5)%/td/tr

34: trtd colspan="2"hr //td/tr

35: /table

36: %

37: }

38: if(p1) out.println("a href=test.jsp?page=" + (p-1) + "上一页/a");

39: if(ppage_count) out.println("a href=test.jsp?page=" + (p+1) + "下一页/a");

40: %

MySQL分页的sql语言怎么写?

1、首先我们建立一个表表的数据,这个表里有25条数据,id从1到25。(下图是部分截图)

2、要分页数据,首先我们假设一页有10条数据,我们可以用mysql的 limit关键字来限定返回多少条数据。并且用order by来排序数据,这里用 id来排序。所以第一页的sql可以如图这样写。

3、执行后得到的数据如图,就是 id从1到10的前10条数据,因为我们是按id升序来排序的。

4、上面第一页的sql是简化的写法,完整的写法如图,得到的结果和上图的一模一样。代码里 limit 0, 10 的意思是从第一条数据开始,取10条数据。(注意的是第一条数据是从0开始的)

5、那么第二页的数据,关键是要知道是从哪一条数据开始,可以用这个公式得到: (页码-1)  * 每页显示多少条,即 (2-1) * 10 = 10, 所以sql语句如图, limit 10, 10。

6、执行后,结果正确,得到id从11到20的10条数据。

7、同理第三页数据的sql如图,br/就是 limit 20, 10。

8、查询的结果如图,因为这页只剩下5条数据了,所以只显示5条数据。如果你有更多页的数据,后面的数据只需要按上面的公式,得到从哪行开始,就可以写对应的sql语句了。

MyBatis怎样实现MySQL动态分页

一、mysql使用limit子句来实现数据库的物理分页,limit子句接受一个或两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数量。在mybatis中,只需要在相应的查询语句后,加上limit子句,即可实现物理分页。如下,以一个只有字段id,name,age的表为例。该配置会根据传入的hashmap,如果含有键start和键end,那么即通过mybatis强大的动态sql,生成含有mysql分页的sql语句。select*fromuserslimit#{start},#{end}二、mybaits简介mybatis,前称ibatis,后改名为mybatis,截止本文成文,最新版本是3.0.6。它和hibernate是java世界使用最多的两种orm框架。hibernate理念最为先进,完全实现面向对象的数据库编程,不需要掌握sql语句,即可实现数据库操作,能够节省开发人员编写大量sql语句的时间。但是,hibernate在处理多表关联时,可能会出现n+1问题,性能会有较大影响,要解决性能问题,需要较深的hibernate知识和项目经验。mybatis需要自己写sql语句,开发效率不如hibernate,很难做到底层多数据库的通用。但对程序员来说有更高的可控性,可以更容易的对sql语句进行优化,提高效率。在开发中直接使用jdbc一个非常普遍的问题就是动态sql。如果参数值、参数本身和数据列都是动态sql,通常的解决方法就是写很多if-else条件语句和字符串连接。而mybatis通过ognl提供了一套非常清晰的方法来解决动态sql的问题。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。