一、项目包结构
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
相关的分页语法。
- 对于 MySQL,会自动添加
-
返回分页结果:
结果包含总记录数、总页数、当前页数据等信息:{ "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。