文章目录
前言
日常开发常用的分页查询功能
一、MySQL的分页查询
在 MySQL 中进行分页查询,可以使用 LIMIT 和 OFFSET 子句来实现。MySQL使用分页查询的基本语法如下:
SELECT * FROM table_name LIMIT offset, count;
LIMIT: 用于限制返回的行数。
offset: 指定从查询结果的哪一行开始返回数据。它是从 0 开始计数的,表示跳过前面的多少行记录。
count: 指定返回的行数,即每页的记录数。
例如如下SQL语句:
SELECT * FROM t_user LIMIT 0,1
0是偏移量,1是行数。表示从数据库第1行开始(计数是从0开始计数的),查询总数据为 1条。
二、使用Java实现分页查询
新建一个SpringBoot项目后,能成功启动运行即可,使用原始方法实现分页查询。
1.封装返回结果类
public class R<T> implements Serializable
{
private static final long serialVersionUID = 1L;
/** 成功 */
public static final int SUCCESS = 200;
/** 失败 */
public static final int FAIL = 500;
private int code;
private String msg;
private T data;
public static <T> R<T> ok()
{
return restResult(null, SUCCESS, null);
}
public static <T> R<T> ok(T data)
{
return restResult(data, SUCCESS, null);
}
public static <T> R<T> ok(T data, String msg)
{
return restResult(data, SUCCESS, msg);
}
public static <T> R<T> fail()
{
return restResult(null, FAIL, null);
}
public static <T> R<T> fail(String msg)
{
return restResult(null, FAIL, msg);
}
public static <T> R<T> fail(T data)
{
return restResult(data, FAIL, null);
}
public static <T> R<T> fail(T data, String msg)
{
return restResult(data, FAIL, msg);
}
public static <T> R<T> fail(int code, String msg)
{
return restResult(null, code, msg);
}
private static <T> R<T> restResult(T data, int code, String msg)
{
R<T> apiResult = new R<>();
apiResult.setCode(code);
apiResult.setData(data);
apiResult.setMsg(msg);
return apiResult;
}
public int getCode()
{
return code;
}
public void setCode(int code)
{
this.code = code;
}
public String getMsg()
{
return msg;
}
public void setMsg(String msg)
{
this.msg = msg;
}
public T getData()
{
return data;
}
public void setData(T data)
{
this.data = data;
}
}
2.封装分页查询数据结果
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {
private Long total;//总记录数
private List rows;//数据列表
}
3.接口实现
(1)controller层
@GetMapping("/pageOne")
public R pageOne(@RequestParam(value = "pageNum" ,defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize){
return R.ok(userService.selectPageOne(pageNum,pageSize), "查询成功");
}
(2)service层
PageBean selectPageOne(Integer pageNum, Integer pageSize);
(3)service.impl层
@Override
public PageBean selectPageOne(Integer pageNum, Integer pageSize) {
Long count = userMapper.selectCount(null);
Integer start = (pageNum - 1) * pageSize;
List<User> userList = userMapper.page(start, pageSize);
PageBean page = new PageBean();
page.setTotal(count);
page.setRows(userList);
return page;
}
(4)mapper层
@Select("select * from t_user limit #{start},#{pageSize}")
List<User> page(Integer start, Integer pageSize);
三、使用PageHelper分页插件
上述只是简单的分页查询,完全满足不了真正的需求。比如:分页查询中会涉及上一页,下一页,首页,尾页,跳转到x页
1.pagehelper插件依赖
<!--MyBatis起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!--PageHelper分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.7</version>
</dependency>
2.接口实现
(1)controller层
@GetMapping("/pageTwo")
public R pageTwo(@RequestParam(value = "pageNum" ,defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize){
return R.ok(userService.selectPageTwo(pageNum,pageSize), "查询成功");
}
(2)service层
返回类型是PageInfo类型
PageInfo<User> selectPageTwo(Integer pageNum, Integer pageSize);
(3)service.impl层
@Override
public PageInfo<User> selectPageTwo(Integer pageNum, Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<User> userList = userMapper.selectList(null);
return new PageInfo<>(userList);
}
三、MyBatis-Plus分页查询
1.mybatis-plus插件依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.4</version>
</dependency>
2.mybatis-plus分页拦截器配置
@Configuration
@MapperScan("com.personal.demo.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
3.接口实现
(1)controller层
@GetMapping("/pageThree")
public R pageThree(@RequestParam(value = "pageNum" ,defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize){
return R.ok(userService.pageThree(pageNum, pageSize), "查询成功");
}
(2)service层
返回类型是IPage类型
IPage<User> pageThree(Integer pageNum, Integer pageSize);
(3)service.impl层
@Override
public IPage<User> pageThree(Integer pageNum, Integer pageSize) {
Page<User> page = new Page<>(pageNum, pageSize);
IPage<User> userIPage = userMapper.selectPage(page, null);
return userIPage;
}
序言
以上就是日常开发分页功能方法,需要注意的是SpringBoot的版本和MyBatis-Plus的版本、mybatis版本对应关系