MyBatis-Plus分页接口实现教程:Spring Boot中如何编写分页查询

MyBatis-Plus分页接口实现教程:Spring Boot中如何编写分页查询

MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了强大的分页插件,可以轻松实现分页查询的功能。在 Spring Boot 项目中使用 MyBatis-Plus 可以大大简化分页逻辑的编写。本文将介绍如何在 Spring Boot 项目中使用 MyBatis-Plus 实现分页接口。

MyBatis-Plus 简介

MyBatis-Plus(简称 MP)是 MyBatis 的一个增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了代码生成器、分页插件、性能分析插件、全局通用操作、MetaObject 等一系列功能,使得 MyBatis 变得更加易用。

Spring Boot 简介

Spring Boot 是 Spring 的一个模块,用于简化新 Spring 应用的初始搭建以及开发过程。Spring Boot 旨在简化配置,通过约定大于配置的原则,提供了大量的默认配置,使得开发者能够快速启动和部署 Spring 应用。

实现步骤

1. 添加 MyBatis-Plus 依赖

pom.xml 文件中添加 MyBatis-Plus 的依赖:

1
2
3
4
5
6
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>

image-20240327015151458

Springboot只能使用3.1.5及以下版本!!!

2. 配置分页插件

在 Spring Boot 的配置类中添加分页插件的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
//@MapperScan("com.example.demo.mapper")
public class MybatisPlusConfig {

/**
* 新增分页拦截器,并设置数据库类型为mysql
*
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}

3. 创建服务层接口

创建一个服务层接口,用于定义分页查询的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserMapper userMapper;

@Override
public Result listPageUser(@RequestParam Integer page, @RequestParam Integer pageSize) {
//分页参数
Page<UserEntity> rowPage = new Page<>(page, pageSize);
//queryWrapper组装查询where条件
LambdaQueryWrapper<UserEntity> queryWrapper = new LambdaQueryWrapper<>();
rowPage = userMapper.selectPage(rowPage, queryWrapper);
return Result.success("数据列表", rowPage);
}
}

4. 创建控制器

创建一个控制器,用于处理 HTTP 请求并调用服务层的分页查询方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
@RequestMapping("/user")
public class UserController {

@Autowired
private UserServiceImpl userServiceImpl;

@PostMapping("/listPage")
@Operation(summary = "列表分页")
public Result listPageUser(@RequestParam Integer page, @RequestParam Integer pageSize) {
return userServiceImpl.listPageUser(page, pageSize);
}
}

5. 运行应用并测试

启动 Spring Boot 应用,并通过 Postman 或其他 API 测试工具发送 POST 请求到 /user/listPage 端点,传递 pagepageSize 参数,即可测试分页查询功能。

6.全部代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.common.req.IdParam;
import com.example.common.resp.Result;
import com.example.system.entity.UserEntity;
import com.example.system.mapper.UserMapper;
import com.example.system.resp.LoginResp;
import com.example.system.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Objects;

/**
* <p>
* 用户表 前端控制器
* </p>
*
* @author he
* @since 2024-03-23
*/
@Tag(name = "用户")
@RestController
@RequestMapping("/userEntity")
public class UserController {

@Autowired
private UserMapper userMapper;
@Autowired
private UserService userService;
private final String id = "User_id";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

@Operation(summary = "列表")
@PostMapping("/list")
public Result listUser() {
return Result.success("数据列表", userService.list());
}

@Operation(summary = "存在")
@PostMapping("/exist")
public Result existUser(@RequestBody @Validated IdParam param) {
QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
wrapper.eq(id.toLowerCase(Locale.ROOT), param.getId());
long count = userService.count(wrapper);
if (count == 0) return Result.success("ID不存在", false);
return Result.success("ID已存在", true);
}

@Operation(summary = "保存")
@PostMapping("/insert")
public Result insertUser(@RequestBody @Validated UserEntity param) {
QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
wrapper.eq(id.toLowerCase(Locale.ROOT), param.getId());
if (userService.count(wrapper) != 0) return Result.failure("ID已存在", sdf.format(new Date()));
if (userService.save(param)) return Result.success("保存成功", sdf.format(new Date()));
return Result.failure("保存失败", sdf.format(new Date()));
}

@Operation(summary = "删除")
@PostMapping("/delete")
public Result deleteUser(@RequestBody @Validated IdParam param) {
QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
wrapper.eq(id.toLowerCase(Locale.ROOT), param.getId());
if (userService.count(wrapper) == 0) return Result.failure("ID不存在", param.getId());
if (userService.remove(wrapper)) return Result.success("删除成功", param.getId());
return Result.failure("删除失败", param.getId());
}

@Operation(summary = "修改")
@PostMapping("/update")
public Result updateUser(@RequestBody @Validated UserEntity param) {
QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
wrapper.eq(id.toLowerCase(Locale.ROOT), param.getId());
if (userService.count(wrapper) == 0) return Result.failure("ID不存在", sdf.format(new Date()));
if (userService.updateById(param)) return Result.success("修改成功", sdf.format(new Date()));
return Result.failure("修改失败", sdf.format(new Date()));
}

@Operation(summary = "查询")
@PostMapping("/select")
public Result selectUser(@RequestBody @Validated IdParam param) {
QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
wrapper.eq(id.toLowerCase(Locale.ROOT), param.getId());
if (userService.count(wrapper) == 0) return Result.failure("ID不存在", param.getId());
return Result.success(userService.getOne(wrapper));
}

@Operation(summary = "查询byAcc")
@PostMapping("/selectByAcc/{param}")
public Result selectUserByAcc(@PathVariable @Validated String param) {
QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
String acc = "User_acc";
wrapper.eq(acc.toLowerCase(Locale.ROOT), param);
if (userService.count(wrapper) == 0) return Result.failure("账号不存在", sdf.format(new Date()));
return Result.success(userService.getOne(wrapper));
}

@Operation(summary = "列表分页")
@PostMapping("/listPage")
public Result listPageUser(@RequestParam Integer page, @RequestParam Integer pageSize) {
//分页参数
Page<UserEntity> rowPage = new Page(page, pageSize);
//queryWrapper组装查询where条件
LambdaQueryWrapper<UserEntity> queryWrapper = new LambdaQueryWrapper<>();
rowPage = userMapper.selectPage(rowPage, queryWrapper);
return Result.success("数据列表", rowPage);
}

@Operation(summary = "导出数据")
@PostMapping("exportExcel")
public void exportExcelUser(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("轮播图", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
List<UserEntity> list = userService.list();
response.setHeader("Content-disposition", "attachment;filename*=" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), UserEntity.class).sheet("轮播图").doWrite(list);
}

@Operation(summary = "导入数据")
@PostMapping("/importExcel")
public Result importExcelUser(MultipartFile file) {
try {
//获取文件的输入流
InputStream inputStream = file.getInputStream();
List<UserEntity> list = EasyExcel.read(inputStream) //调用read方法
//注册自定义监听器,字段校验可以在监听器内实现
//.registerReadListener(new UserListener())
.head(UserEntity.class) //对应导入的实体类
.sheet(0) //导入数据的sheet页编号,0代表第一个sheet页,如果不填,则会导入所有sheet页的数据
.headRowNumber(1) //列表头行数,1代表列表头有1行,第二行开始为数据行
.doReadSync();//开始读Excel,返回一个List<T>集合,继续后续入库操作
//模拟导入数据库操作
for (UserEntity entity : list) {
userService.saveOrUpdate(entity);
}
return Result.success("导入成功", sdf.format(new Date()));
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}

}

结语

通过上述步骤,我们在 Spring Boot 项目中使用 MyBatis-Plus 实现了一个分页查询接口。MyBatis-Plus 提供的分页插件极大地简化了分页逻辑的编写,使得开发者能够更专注于业务逻辑的实现。通过学习和实践,你可以更深入地理解 MyBatis-Plus 和 Spring Boot 的强大功能,以及如何将它们应用到实际的开发工作中。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 何福海
  • 访问人数: | 浏览次数:

请我喝杯奶茶吧~

支付宝
微信