在这些控件里要达到分页的效果,一般都会传2个参数,第一个是表示当前页的索 引(一般从0开始),第二个表示当前页展示多少条业务记录,然后将相应的参数传递给List<T> getList(PagenateArgs args)方法,最终实现数据库中的分页时候可以使用limit关键词(针对mysql)进行分页,如果是oracle或者sql server他们都有自带的rownum函数可以使用。
针对上述思路,首先在 demomybatismodel下面新建一个名为PagenateArgs的分页参数实体类与一个名为SortDirectionEnum的枚举 类,里面包含当前页面索引pageIndex, 当前页展示业务记录数pageSize, pageStart属性表示从第几条开始,(pageStart=pageIndexpageSize)因为limit关键词用法是表示limit 起始条数(不包含),取几条,orderFieldStr排序字段,orderDirectionStr 排序方向,所以具体创建如下:
package davidmybatismodel;
/
分页参数实体类
/
public class PagenateArgs {
private int pageIndex;
private int pageSize;
private int pageStart;
private String orderFieldStr;
private String orderDirectionStr;
public PagenateArgs() {
// TODO Auto-generated constructor stub
}
public PagenateArgs(int pageIndex, int pageSize, String orderFieldStr, String orderDirectionStr) {
thispageIndex = pageIndex;
thispageSize = pageSize;
thisorderFieldStr = orderFieldStr;
thisorderDirectionStr = orderDirectionStr;
pageStart = pageIndex pageSize;
}
public int getPageIndex() {
return pageIndex;
}
public int getPageStart() {
return pageStart;
}
public int getPageSize() {
return pageSize;
}
public String orderFieldStr() {
return orderFieldStr;
}
public String getOrderDirectionStr() {
return orderDirectionStr;
}
}
package davidmybatismodel;
/
排序枚举
/
public enum SortDirectionEnum {
/
升序
/
ASC,
/
降序
/
DESC
}
完成上面的步骤以后在IVisitorOperation接口类中继续添加一个方法public List<Visitor> getListByPagenate(PagenateArgs args),这次的分页其实也就是在这个的基础上稍加改动即可,IVisitorOperation接口类 改动后如下所示:
package davidmybatisdemo;
import javautilList;
import davidmybatismodelPagenateArgs;
import davidmybatismodelVisitor;
import davidmybatismodelVisitorWithRn;
public interface IVisitorOperation {
/
基础查询
/
public Visitor basicQuery(int id);
/
添加访问者
/
public int add(Visitor visitor);
/
删除访问者
/
public int delete(int id);
/
更新访问者
/
public int update(Visitor visitor);
/
查询访问者
/
public Visitor query(int id);
/
查询List
/
public List<Visitor> getList();
/
分页查询List
/
public List<Visitor> getListByPagenate(PagenateArgs args);
}
接下来改动VisitorMapperxml配置文件了,新增一个<select>节点id与参数类型参照前几章的方式配置好,如下此处新增的id就为getListByPagenate,配置好以后如下
<xml version="10" encoding="UTF-8">
<!DOCTYPE mapper
PUBLIC "-//mybatisorg//DTD Mapper 30//EN"
">
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 分页最简单了 SELECT FROM Account WHERE (usertype='base' or usertype='home' or usertype='salse') and logindate is not null order by logindate desc LIMIT 起始行, 每页多少行 LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)
以上就是关于MyBatis怎样实现MySQL动态分页全部的内容,包括:MyBatis怎样实现MySQL动态分页、Finereport6.5怎么实现数据库分页,我用的是MySQL数据库、MySql中查询语句实现分页功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)