SpringBoot中使用MyBatis-Plus实现分页接口的详细教程
作者:洛可可白
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 的依赖:
<!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency>
Springboot只能使用3.1.5及以下版本!!!
2. 配置分页插件
在 Spring Boot 的配置类中添加分页插件的配置:
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. 创建服务层接口
创建一个服务层接口,用于定义分页查询的方法:
@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 请求并调用服务层的分页查询方法:
@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
端点,传递 page
和 pageSize
参数,即可测试分页查询功能。
6.全部代码
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 的强大功能,以及如何将它们应用到实际的开发工作中。
以上就是SpringBoot中使用MyBatis-Plus实现分页接口的详细教程的详细内容,更多关于SpringBoot MyBatis-Plus分页接口的资料请关注脚本之家其它相关文章!