基于 Guns v5.1 框架的分页教程
基于 Guns v5.1 框架的分页教程
第一步:Controller 层处理前端请求
在 Controller 中,需要接收 Bootstrap Table 传来的分页参数(limit
, offset
, sort
, order
)。Guns 提供了封装好的 PageFactory
类来简化 Page 对象的创建。
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;/*** 获取用户列表(分页)*/@RequestMapping("/list")public Object list() {// 使用 PageFactory 构建分页对象Page<User> page = new PageFactory<User>().defaultPage();// 调用 service 查询分页数据return userService.selectUserPage(page);}
}
Mapper 接口定义 MyBatis 查询方法
如果是单表查询,可以直接使用 MyBatis-Plus 提供的 selectPage()
方法。
如果是多表关联查询(复杂 SQL),可以在自定义 Mapper 中添加一个接受 Page<T>
参数的方法。
public interface UserMapper extends BaseMapper<User> {/*** 复杂条件分页查询(例如关联其他表)* 注意:Page 参数必须放在第一位,MyBatis-Plus 插件才能识别并自动填充结果*/List<User> selectUserWithRole(Page<User> page, @Param("condition") String condition);
}
Service 接口定义业务逻辑
服务接口中声明分页查询方法:
public interface UserService extends IService<User> {/*** 分页查询用户信息*/Page<User> selectUserPage(Page<User> page);
}
ServiceImpl 实现具体业务逻辑
在实现类中调用对应的 Mapper 方法进行查询:
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic Page<User> selectUserPage(Page<User> page) {// 可以根据需求添加查询条件,也可以直接传递空对象或 nullString condition = ""; // 示例条件(可从 request 中获取等)// 调用 mapper 的分页方法List<User> userList = baseMapper.selectUserWithRole(page, condition);// 将分页结果封装回 page 对象page.setRecords(userList);return page;}
}
Wrapper 构造查询条件(可选)
如果你希望使用 QueryWrapper
或 LambdaQueryWrapper
来动态构建查询条件,可以在 Service 中构建:
@Override
public Page<User> selectUserPage(Page<User> page) {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.like(StringUtils.isNotBlank(condition), "name", condition); // 添加查询条件return baseMapper.selectPage(page, wrapper);
}
JS 端发送分页请求(Bootstrap Table 示例)
前端使用的是 Bootstrap Table 控件,默认会自动携带分页参数(limit
, offset
, sort
, order
)发送请求。
$('#table').bootstrapTable({url: '/user/list',method: 'get',pagination: true,sidePagination: 'server', // 后端分页pageSize: 10,pageList: [10, 20, 50],columns: [{field: 'id',title: 'ID'}, {field: 'name',title: '姓名'}]
});
总结 & 流程图
层级 | 功能 |
---|---|
JS / Bootstrap Table | 发送分页请求,携带 limit , offset , sort , order |
Controller | 接收请求,使用 PageFactory 创建 Page 分页对象 |
Service | 定义接口并调用 Mapper 执行分页查询 |
Mapper | 自定义 SQL 查询接口,第一参数为 Page<T> 用于复杂查询 |
Model / Wrapper(可选) | 构建查询条件(如 QueryWrapper、LambdaQueryWrapper) |
补充说明
1. 分页插件生效前提
确保已在启动类或配置类中启用 MyBatis Plus 分页插件:
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisPlusConfig {@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
}
2. PageFactory 工具类源码回顾
该工具类帮助统一处理分页参数,避免手动获取 request 数据,提升开发效率。
public class PageFactory<T> {public Page<T> defaultPage() {HttpServletRequest request = HttpKit.getRequest();int limit = Integer.valueOf(request.getParameter("limit"));int offset = Integer.valueOf(request.getParameter("offset"));String sort = request.getParameter("sort");String order = request.getParameter("order");if (ToolUtil.isEmpty(sort)) {return new Page<>((offset / limit + 1), limit);} else {Page<T> page = new Page<>((offset / limit + 1), limit, sort);page.setAsc(Order.ASC.getDes().equals(order));return page;}}
}
— by AGI 老教程翻新