当前位置:首页 > 技术 > 正文内容

Spring Boot整合MyBatis-Plus实现高效数据分页查询

访客 技术 2026年8月29日 1

组件依赖与环境准备

在构建Java后端服务时,若需快速落地分页逻辑,首选引入MyBatis-Plus官方启动器。该依赖内置了动态SQL解析与拦截器机制,无需额外编写底层游标处理代码。以下为Maven配置片段:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.5</version>
</dependency>
<!-- 关联对应数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

拦截器注册与方言适配

框架默认关闭分页拦截功能,必须通过配置类显式注入插件实例。新版本推荐采用独立Bean定义方式,并指明目标数据库方言以生成正确的Limit语法。

import com.baomidou.mybatisplus.annotation.DbType;
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;

@Configuration
public class DbPluginRegistry {

    @Bean
    public MybatisPlusInterceptor initializePagination() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 锁定MySQL方言,自动转换分页语句
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

数据模型与持久层定义

实体类负责映射关系型表结构,Mapper接口继承基础抽象类即可获取内置方法。此处以员工档案表为例进行演示:

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;

@Data
@TableName("biz_staff")
public class StaffDO {
    private Long workerId;
    private String fullName;
    private String workEmail;
    private LocalDateTime entryTime;
}
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface StaffRepository extends BaseMapper<StaffDO> {
    // 基础CRUD已覆盖,复杂场景可在此扩展
}

业务层分页策略实施

实际开发中通常面临两种场景:简单条件过滤与多表关联查询。下面分别展示标准链式调用与自定义XML映射的实现路径。

隐式分页(基于BaseMapper)

直接利用框架提供的通用选择方法,传入分页对象与条件构造器即可。底层会自动执行Count查询与数据提取。

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

@Service
public class StaffBusinessService {

    @Resource
    private StaffRepository staffRepo;

    public IPage<StaffDO> fetchStaffList(Integer currentPage, Integer rowLimit) {
        // 初始化分页容器,索引默认从1开始
        Page<StaffDO> queryContainer = new Page<>(currentPage, rowLimit);
        
        // 附加过滤规则
        LambdaQueryWrapper<StaffDO> filterChain = new LambdaQueryWrapper<>();
        filterChain.like(StaffDO::getWorkEmail, "@example.com");
        
        // 触发数据抓取
        IPage<StaffDO> fetchedData = staffRepo.selectPage(queryContainer, filterChain);
        
        return fetchedData;
    }
}

显式分页(自定义SQL映射)

当涉及联合查询或窗口函数时,需编写专属SQL文件。注意第一个参数必须为分页对象,框架会替换原有SELECT语句并追加Limit子句。

// Repository接口定义
public interface StaffRepository extends BaseMapper<StaffDO> {
    IPage<StaffDO> getFilteredStaff(Page<StaffDO> pageParam, String departmentCode);
}
<!-- resources/mapper/StaffRepository.xml -->
<mapper namespace="com.demo.repo.StaffRepository">
    <select id="getFilteredStaff" resultType="com.demo.model.StaffDO">
        SELECT worker_id, full_name, work_email, entry_time 
        FROM biz_staff 
        WHERE dept_code = #{departmentCode}
        ORDER BY entry_time DESC
    </select>
</mapper>
// 业务层调用示意
public IPage<StaffDO> loadDepartedStaff(String targetDept) {
    Page<StaffDO> pageReq = new Page<>(1, 20);
    return staffRepo.getFilteredStaff(pageReq, targetDept);
}

控制层暴露与参数校验

RESTful接口接收前端传参,并透传给Service层。框架会自动将返回的分页封装体序列化为JSON响应。

import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;

@RestController
@RequestMapping("/api/v1/hr")
public class PersonnelController {

    @Resource
    private StaffBusinessService hrService;

    @GetMapping("/roster")
    public IPage<StaffDO> queryEmployeePage(
            @RequestParam(name = "p", defaultValue = "1") Integer pageNum,
            @RequestParam(name = "sz", defaultValue = "15") Integer pageSize) {
        return hrService.fetchStaffList(pageNum, pageSize);
    }
}

关键注意事项排查

  • 插件未生效:检查配置文件是否遗漏@Bean注解,或拦截器加载顺序被其他AOP组件覆盖。
  • Count统计异常:自定义XML中切勿硬编码LIMIT关键字,否则会导致重复截取或语法报错。
  • 内存溢出风险:严禁使用超大分页容量(如每页10万条),建议配合索引优化或限制单次查询上限。
  • 字段映射差异:数据库驼峰命名与Java属性不一致时,需在YAML开启map-underscore-to-camel-case配置,或在实体添加@TableField注解。

通过上述拦截器机制与标准API组合,开发者可将原本繁琐的SQL拼接工作交由框架代理。无论是单表检索还是复杂报表导出,均能保持代码整洁并降低维护成本。合理运用IPage元数据辅助前端UI渲染,可实现完整的流式数据体验。

标签: MyBatis-Plus

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。