MyBatis-Plus 分页插件使用示例
作者:wh_xia_jun
本文主要介绍了MyBatis-Plus 分页插件使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一、项目包结构
src/main/java └─ com.neuedu.hisweb ├── config │ └── MybatisPlusConfig.java // 配置类(已提供) ├── controller │ └── UserController.java // 控制器 ├── entity │ └── User.java // 实体类 ├── mapper │ └── UserMapper.java // Mapper 接口 ├── service │ ├── UserService.java // Service 接口 │ └── impl │ └── UserServiceImpl.java // Service 实现 └── HisWebApplication.java // 启动类
二、实体类 (User.java)
package com.neuedu.hisweb.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user") // 对应数据库表名
public class User {
@TableId // 主键注解
private Long id;
private String username;
private String password;
private Integer age;
private String email;
}三、Mapper 接口 (UserMapper.java)
package com.neuedu.hisweb.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.neuedu.hisweb.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 继承 BaseMapper 后,自动拥有 CRUD 方法
// 无需编写 selectById, insert, update, delete 等方法
}四、Service 接口 (UserService.java)
package com.neuedu.hisweb.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.neuedu.hisweb.entity.User;
public interface UserService {
// 分页查询用户列表
IPage<User> getUserPage(Page<User> page);
// 条件分页查询
IPage<User> getUserPageByCondition(Page<User> page, String username);
}五、Service 实现 (UserServiceImpl.java)
package com.neuedu.hisweb.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.neuedu.hisweb.entity.User;
import com.neuedu.hisweb.mapper.UserMapper;
import com.neuedu.hisweb.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
private UserMapper userMapper;
// 分页查询所有用户
@Override
public IPage<User> getUserPage(Page<User> page) {
// Page 参数包含页码和每页条数
// 调用 BaseMapper 的 selectPage 方法,自动生成分页 SQL
return userMapper.selectPage(page, null); // null 表示无查询条件
}
// 条件分页查询
@Override
public IPage<User> getUserPageByCondition(Page<User> page, String username) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("username", username); // 模糊查询用户名
// 带条件的分页查询
return userMapper.selectPage(page, queryWrapper);
}
}六、Controller (UserController.java)
package com.neuedu.hisweb.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.neuedu.hisweb.entity.User;
import com.neuedu.hisweb.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
// 分页查询用户列表
@GetMapping("/page")
public IPage<User> getUserPage(
@RequestParam(defaultValue = "1") Integer pageNum, // 页码,默认第1页
@RequestParam(defaultValue = "10") Integer pageSize // 每页条数,默认10条
) {
// 创建分页对象
Page<User> page = new Page<>(pageNum, pageSize);
// 调用 Service 方法进行分页查询
return userService.getUserPage(page);
}
// 条件分页查询
@GetMapping("/page/condition")
public IPage<User> getUserPageByCondition(
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize,
@RequestParam(required = false) String username // 可选参数:用户名
) {
Page<User> page = new Page<>(pageNum, pageSize);
// 带条件的分页查询
return userService.getUserPageByCondition(page, username);
}
}七、配置类 (MybatisPlusConfig.java)
package com.neuedu.hisweb.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* MyBatis-Plus 配置类
*/
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 创建 MyBatis-Plus 拦截器管理器
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
// 可以添加其他插件(如乐观锁、逻辑删除等)
// interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}八、启动类 (HisWebApplication.java)
package com.neuedu.hisweb;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.neuedu.hisweb.mapper") // 扫描 Mapper 接口
public class HisWebApplication {
public static void main(String[] args) {
SpringApplication.run(HisWebApplication.class, args);
}
}九、使用示例
1. 访问分页接口
通过浏览器或 Postman 访问:
GET http://localhost:8080/api/users/page?pageNum=1&pageSize=5
2. 带条件的分页查询
GET http://localhost:8080/api/users/page/condition?pageNum=1&pageSize=5&username=张
十、分页插件工作原理
拦截器生效:
当调用 selectPage() 方法时,PaginationInnerInterceptor 会拦截 SQL 查询。
自动生成分页 SQL:
- 对于 MySQL,会自动添加
LIMIT ? OFFSET ?。 - 对于 Oracle,会添加
ROWNUM相关的分页语法。
返回分页结果:
结果包含总记录数、总页数、当前页数据等信息:
{
"records": [ /* 当前页数据 */ ],
"total": 100, // 总记录数
"size": 10, // 每页条数
"current": 1, // 当前页码
"pages": 10 // 总页数
}十一、配置说明
分页插件配置:
// 可自定义分页插件参数 PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(); paginationInterceptor.setMaxLimit(1000L); // 限制单页最大条数 paginationInterceptor.setOverflow(false); // 溢出总页数后是否进行处理 interceptor.addInnerInterceptor(paginationInterceptor);
多数据源配置:
若使用多数据源,需指定数据库类型:
paginationInterceptor.setDbType(DbType.MYSQL);
我们可以轻松实现分页查询功能,无需手动编写复杂的分页 SQL。
到此这篇关于MyBatis-Plus 分页插件使用示例的文章就介绍到这了,更多相关MyBatis-Plus 分页插件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
