PageHelper插件,搭配PageInfo,实现简单且强大的List转PageInfo功能

英雄要问出处:
转载收藏自 :https://www.cnblogs.com/kelelipeng/p/13360828.html

**

内容如下

**

平常我们使用分页插件的时候,都是很机械的套用

PageHelper.startPage(1, 10);
Example example = new Example(Employee.class);
example.createCriteria().andEqualTo("employeeSex", "男");
List<Employee> list = employeeTKMapper.selectByExample(example);
PageInfo<Employee> pageinfo=new PageInfo<>(list);

先PageHelper.startPage(1, 10)开始分页,再selectlist查询数据库的时候会自动加上limit 1,10,最后封装成PageInfo的时候会自动带上页码、页大小、总数等。

问题引入情景:

@Autowired
private EmployeeService employeeService;

public ApiResult<PageInfo> getAllEmloyee() {
PageHelper.startPage(1, 3);
// 调用EmployeeService中的方法
List<Employee> list = employeeService.getAll();
PageInfo<Employee> pageInfo = new PageInfo<>(list);
return ApiResult.success(pageInfo);
}
 


public List<Employee> getAll() {
Example example = new Example(Employee.class);
example.createCriteria().andEqualTo("employeeSex", "男");
List<Employee> list = employeeTKMapper.selectByExample(example);
return list;
}

简答说就是:在一个方法中使用PageHelper.startPage(1, 3),再调用另一个方法查询数据库
这样的结果:查询数据库也是会带上分页信息(已验证,你们可以自己去验证看一下)

这样我就在想,为什么PageHelper.startPage(1, 3)会有这么大能力呢?

看一下源码

protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
/**
* 设置 Page 参数
*
* @param page
*/
protected static void setLocalPage(Page page) {
LOCAL_PAGE.set(page);
}

这是setLocalPage()方法,LOCAL_PAGE是当前线程,通常存储数据为了在同一个线程中都可以访问到

这里的意思就是 将分页信息保存在当前线程中

看到这里就豁然开朗了,解释了上面为什么在另一个方法中执行selectlist的时候也会自动加上分页信息
因为当前请求就对应一个线程,虽然是方法之间存在调用,但是他们还是处于同一个线程中,共享ThreadLocal中的数据

至于为什么PageHelper.startPage(1, 3)就可以达到分页效果,这里不做详细的源代码解读(我也没看过…)
但是我觉得大致流程就是:

分页插件的使用,首先是在Mybatis里面配置了分页拦截器(PageInterceptor),即在执行相关Sql之前会拦截做一点事情;
所以应该就是在执行selectlist的时候,会自动为sql加上limit 1,3

还有一点就是使用了PageHelper.startPage,selectlist查询之后赋值给的List list
这个list可以Debug看一下是Page 类型

再看一下,Page类是ArrayList子类

所以在new PageInfo<>(list)的时候可以把页码、页大小、总页数等信息给pageinfo

可以看一下,new PageInfo<>(list)源码

这又让我想到了,如果把PageHelper.startPage(1, 3)去掉,将查询出来的list,再new PageInfo<>(list)

Debug看了一下

没有PageHelper.startPage(1, 3),查询的list是ArrayList类型:所以肯定就是走下面的
else if (list instanceof Collection)…

以上就是我对PageHelper.startPage和new PageInfo<>(list)的一些探索和思考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PageHelper是一个优秀的分页插件,可以快速实现分页功能。而PageInfoPageHelper中用于封装分页信息的类,可以方便地获取分页相关的信息,比如当前页码、总页数、总记录数等。下面是一个基于PageHelperPageInfo实现分页的示例代码: 1. 首先,在pom.xml中添加PageHelper依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.1</version> </dependency> ``` 2. 在需要进行分页的Mapper方法中添加分页参数: ```java public interface UserMapper { List<User> selectAllUsers(); List<User> selectUsersByPage(@Param("start") int start, @Param("pageSize") int pageSize); } ``` 3. 在DAO层中进行分页操作: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public PageInfo<User> getUsersByPage(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List<User> userList = userMapper.selectAllUsers(); return new PageInfo<>(userList); } } ``` 4. 在Controller中获取分页数据: ```java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping public PageInfo<User> getUsersByPage(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) { return userService.getUsersByPage(pageNum, pageSize); } } ``` 5. 在前端页面中使用PageInfo组件进行分页: ```html <ul> <li v-for="user in userList" :key="user.id">{{ user.name }}</li> </ul> <PageInfo :page-info="pageInfo" @page-change="handlePageChange" /> ``` ```js import PageInfo from 'vue-pageinfo' export default { components: { PageInfo }, data() { return { userList: [], // 当前页的用户列表 pageInfo: null // 分页信息 } }, mounted() { this.getUserList() }, methods: { getUserList() { axios.get('/users', { params: { pageNum: this.pageInfo ? this.pageInfo.pageNum : 1, pageSize: this.pageInfo ? this.pageInfo.pageSize : 10 } }).then(response => { this.userList = response.data.list this.pageInfo = response.data }) }, handlePageChange(page) { // 处理页码改变事件 this.pageInfo.pageNum = page this.getUserList() } } } ``` 希望这个示例能够帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值