PageHelper.startPage与PageHelper.offsetPage区别
时间: 2023-12-23 10:56:46 浏览: 263
PageHelper是Mybatis的一个分页插件,提供了两种分页方式:基于物理分页的startPage和基于逻辑分页的offsetPage。
startPage方法是使用物理分页,它会在SQL查询前自动添加一句SQL,类似于limit x,y。其中x为起始行数,y为每页显示的记录数。例如,我们需要查询第1页,每页显示10条记录,那么SQL就会自动添加limit 0,10。startPage方法的使用如下:
```java
PageHelper.startPage(1, 10);
List<User> userList = userMapper.selectList();
```
offsetPage方法是使用逻辑分页,它不会在SQL查询前添加limit语句,而是将查询结果全部返回,然后再通过Java代码进行分页。这种方式可以避免MySQL在查询大数据时进行全表扫描,但是需要注意查询结果集的大小,如果结果集过大,会造成内存溢出。offsetPage方法的使用如下:
```java
List<User> userList = userMapper.selectList();
PageInfo pageInfo = new PageInfo(userList);
List<User> pageList = pageInfo.getList().subList(0, 10);
```
可以看出,startPage方法是在SQL查询前进行分页,而offsetPage方法是在Java代码中进行分页。使用哪种方式取决于具体的需求和数据量大小。
相关问题
pagehelper.offsetpage 坑
PageHelper.offsetPage方法是用来进行分页查询的,但是需要注意的是,使用该方法时会直接调用一次接口查询数据,而不是先查询全部数据再进行分页。所以在使用offsetPage方法时,如果同时使用了group by去重,会导致数据报错,因为offsetPage方法只会查询指定范围内的数据,不会考虑去重操作。
相反,PageHelper.startPage方法是先查询全部数据再进行分页,内部会根据指定的offset和limit参数进行数据筛选和分页。所以在使用startPage方法时,startPage的值是多少,offset就是多少,不会出现数据重复的问题。
近日在写java接口的时候,如果错误地使用了PageHelper.offsetPage方法而不是PageHelper.startPage方法,可能会导致数据重复的bug出现。所以在使用PageHelper进行分页时,需要注意使用正确的方法来避免这样的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [PageHelper.startPage与PageHelper.offsetPage区别](https://blog.csdn.net/wangjie33589/article/details/128589369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
sql中有limit再用pagehelper.offsetpage
在使用PageHelper进行分页时,如果SQL中已经使用了LIMIT关键字,并且希望结合PageHelper的offsetPage方法进行分页,可以使用PageHelper.startPage方法来替代LIMIT关键字。startPage方法会在执行查询SQL之前自动添加LIMIT语句,并将分页参数设置到线程局部变量中,以便在后续查询中使用。这样就能够实现在SQL中使用LIMIT再结合PageHelper.offsetPage方法进行分页的效果。
阅读全文