本文目录一览:
- 1、MySql中查询语句实现分页功能
- 2、怎样用mysql语句实现分页
- 3、新手怎么以最简单的方式实现jsp+mysql分页
- 4、MySQL分页的sql语言怎么写?
- 5、MyBatis怎样实现MySQL动态分页
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的问题。