MyBatis怎样实现MySQL动态分页

MyBatis怎样实现MySQL动态分页,第1张

在这些控件里要达到分页的效果,一般都会传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中查询语句实现分页功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10194575.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存