跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Java大前端java

MyBatisPlus 与 Thymeleaf 全栈分页实战方案

MyBatisPlus 配合 Thymeleaf 实现全栈分页方案。通过 Maven 引入依赖,定义实体类映射数据库表。业务层使用 Page 对象封装分页参数,结合 QueryWrapper 构建查询条件。控制层接收前端页码与大小参数,返回分页数据。前端通过 AJAX 请求加载数据并渲染表格,同步生成分页条。若分页无效,需检查 MybatisPlusInterceptor 及 PaginationInnerInterceptor 配置是否正确。该方案适用于 Java 后端与 Thymeleaf 前端混合架构场景。

RedisGeek发布于 2026/3/24更新于 2026/4/303 浏览
MyBatisPlus 与 Thymeleaf 全栈分页实战方案

MyBatisPlus 环境搭建

MyBatisPlus 是一款基于 MyBatis 的增强版 ORM 框架,提供了分页插件、代码生成器等强大功能。在 Spring Boot 项目中引入依赖即可快速开始。

这里以 Maven 为例,在 pom.xml 中增加以下依赖来引入 MyBatisPlus。由于项目集成 PostgreSQL 数据库,需同时引入对应的驱动包。为了简化 Getter/Setter 等方法,还引入了 Lombok 组件:

<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatis-plus.version}</version>
</dependency>
<!-- lombok 代码自动生成组件 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>
<!-- PostgreSql 驱动包 -->
<dependency>
    <groupId>net.postgis</groupId>
    <artifactId>postgis-jdbc</artifactId>
    <version>2.5.0</version>

</dependency>

Java 后台分页实现

实体类定义

实体类的实现相对简单,直接映射数据库表结构。注意使用 @TableName 指定表名,利用 Lombok 注解减少样板代码。

package org.yelang.pcwater.domain;

import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

/**
 * - 停水信息表,用于同步停水数据
 */
@TableName(value = "biz_stop_water_info")
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class StopWaterInfo implements Serializable {
    private static final long serialVersionUID = -1582687729349525826L;

    @TableId(value="pk_id")
    private Long pkId;

    @TableField(value = "affect_user")
    private String affectUser; // 停水客户

    @TableField(value = "affected_range")
    private String affectedRange; // 停水范围

    @TableField(value = "affect_region")
    private String affectRegion; // 停水区域

    @TableField(value = "created_on")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createdOn; // 原创建时间

    @TableField(value = "inform_emergency_plan")
    private String informEmergencyPlan; // 应急计划

    @TableField(value = "inform_id")
    private Integer informId; // 信息标识

    @TableField(value = "inform_remark")
    private String informRemark; // 备注信息

    @TableField(value = "main_lead_path")
    private String mainLeadPath; // 停水主管径

    private String position; // 停水地点

    private String reason; // 停水原因

    @TableField(value = "service_phone")
    private String servicePhone; // 服务热线

    @TableField(value = "show_end_date")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @SerializedName("showenddate")
    private Date showEndDate; // 显示结束时间

    @TableField(value = "stop_end_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date stopEndTime; // 停水结束时间

    @TableField(value = "stop_start_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date stopStartTime; // 停水开始时间

    @TableField(value = "stop_time")
    @SerializedName("stoptime")
    private String stopTime; // 停水时间

    @TableField(value = "stopwater_type")
    private String stopwaterType; // 停水类型

    @TableField(value = "supply_emergency_plan")
    private String supplyEmergencyPlan; // 应急供应计划

    @TableField(value = "supply_remark")
    private String supplyRemark; // 供应备注

    private String title; // 停水标题

    private String type; // 类型

    @TableField(value = "regin_name")
    private String reginName; // 区域名称

    @TableField(value = "sync_sno")
    private Long syncSno; // 同步批次号
}

业务层分页逻辑

查询业务中,分页是核心环节。我们使用 MyBatisPlus 提供的 Page 对象来完成具体业务。首先在业务接口中定义方法签名:

/**
 * -根据区域查询分页停水信息列表
 * @param pageNum
 * @param pageSize
 * @param regionName
 * @return
 */
IPage<StopWaterInfo> page(Integer pageNum, Integer pageSize, String regionName);

接着在实现类中编写逻辑。通过构造 QueryWrapper 设置查询条件(如模糊匹配区域)和排序规则,再传入 Page 对象执行查询:

@Override
public IPage<StopWaterInfo> page(Integer pageNum, Integer pageSize, String regionName) {
    QueryWrapper<StopWaterInfo> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("regin_name", regionName);
    queryWrapper.orderByDesc("created_on");
    
    Page<StopWaterInfo> page = new Page<>(pageNum, pageSize);
    return this.baseMapper.selectPage(page, queryWrapper);
}

这里我们通过构造 Page 对象,将控制层传入的当前页码和每页显示条数一起传入,然后传给 MyBatisPlus 进行查询。

控制层实现

控制层负责接收前端参数并返回结果。核心代码如下:

@PostMapping("/list")
@ResponseBody
public AjaxResult list(
        @RequestParam(defaultValue = "1") Integer pageNum,
        @RequestParam(defaultValue = "5") Integer pageSize,
        @RequestParam(defaultValue = "") String regionName) {
    IPage<StopWaterInfo> page = waterInfoService.page(pageNum, pageSize, regionName);
    AjaxResult result = AjaxResult.success();
    result.put("data", page);
    return result;
}

Thymeleaf 分页集成

Thymeleaf 是一种现代的 Java 模板引擎,能够很好地与 Spring Boot 集成。本节介绍如何在 Thymeleaf 页面中集成后端分页数据,并实现分页条展示。

分页表格展示

首先需要在 HTML 中定义表格结构。为了演示简单,这里使用 AJAX 方式从后端加载数据。

<div>
    <table id="data-table">
        <thead>
            <tr>
                <th>创建时间</th>
                <th>停水地点</th>
                <th>原因</th>
            </tr>
        </thead>
        <tbody id="table-body">
            <!-- 动态内容 -->
        </tbody>
    </table>
</div>

JavaScript 部分负责发起请求并渲染表格:

function renderTablePage(page) {
    currentPage = page;
    const tableBody = document.getElementById('table-body');
    tableBody.innerHTML = '';
    
    $.ajax({
        type: "post",
        url: ctx + "datasync/list",
        dataType: "json",
        cache: false,
        processData: true,
        data: {"pageNum": page, "pageSize": EVENTS_PER_PAGE, "regionName": ""},
        success: function(result) {
            const pageData = result.data.records;
            const totalPages = result.data.pages;
            
            if (pageData.length === 0) {
                tableBody.innerHTML = `<tr><td colspan="3">未找到符合条件的停水事件。</td></tr>`;
            } else {
                pageData.forEach(event => {
                    const row = tableBody.insertRow();
                    row.innerHTML = `
                        <td>${event.createdOn}</td>
                        <td>${event.position}</td>
                        <td>${event.reason}</td>
                    `;
                });
            }
            renderPagination(totalPages);
        },
        error: function() {
            tableBody.innerHTML = `<tr><td colspan="3">未找到符合条件的停水事件。</td></tr>`;
        }
    });
}

拿到后台响应后,循环数据动态拼接表格行,同时调用分页条渲染函数。

分页条集成

分页条同样需要嵌入页面元素:

<div>
    <nav aria-label="Table Pagination">
        <ul id="table-pagination"></ul>
    </nav>
</div>

在获取表格数据的同时,同步设置分页条。这里不采用复杂样式,仅展示上一页和下一页按钮:

function renderPagination(totalPages) {
    const paginationContainer = document.getElementById('table-pagination');
    paginationContainer.innerHTML = '';
    
    if (totalPages <= 1) return;
    
    // 上一页按钮
    let prevHtml = '<li class="disabled">';
    if (currentPage > 1) {
        prevHtml = '<li>';
    }
    prevHtml += `<a href="#" onclick="changePage(${totalPages},${currentPage - 1})" aria-label="Previous">前一页</a></li>`;
    paginationContainer.innerHTML += prevHtml;
    
    // 下一页按钮
    let nextHtml = '<li class="disabled">';
    if (currentPage < totalPages) {
        nextHtml = '<li>';
    }
    nextHtml += `<a href="#" onclick="changePage(${totalPages},${currentPage + 1})" aria-label="Next">后一页</a></li>`;
    paginationContainer.innerHTML += nextHtml;
}

常见问题处理

在开发过程中,可能会遇到分页条不展示的问题,通常是因为没有正确配置 MyBatisPlus 的分页插件。

如果应用截图显示数据全部加载且无分页条,大概率是拦截器未生效。解决办法是在后台配置好分页插件:

package org.yelang.pcwater.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor i = new MybatisPlusInterceptor();
        i.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
        return i;
    }
}

配置完成后再次运行程序,分页条即可正常显示。

总结

本文介绍了如何通过 MyBatisPlus 和 Thymeleaf 的深度整合,实现一个高效、稳定的全栈分页解决方案。从基础的环境搭建到具体的代码实现,再到常见问题的排查,希望能帮助开发者掌握这一重要技能。

目录

  1. MyBatisPlus 环境搭建
  2. Java 后台分页实现
  3. 实体类定义
  4. 业务层分页逻辑
  5. 控制层实现
  6. Thymeleaf 分页集成
  7. 分页表格展示
  8. 分页条集成
  9. 常见问题处理
  10. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Harness Engineering 工程化教程:AI Agent 复杂长任务实践指南
  • AI 协作编写 Pytest 单元测试:覆盖率提升实战记录
  • 《人工智能的底层逻辑》:清华大学 AI 通识经典解析
  • 大语言模型超参数入门与调优指南
  • Python 股票金融数据量化分析实战
  • 交通系统容灾演练:基于 Java 的灾难场景模拟实践
  • K 均值聚类算法:原理、实现与 Python 实践
  • Mac Mini M4 本地部署大模型:Ollama、Llama 与 ComfyUI 环境搭建
  • VS Code 远程连接服务器后 GitHub Copilot 无法使用的问题解决
  • Ubuntu 22.04 环境下编译安装 libwebkit2gtk-4.1-0 指南
  • libwebkit2gtk-4.1-0 安装依赖处理:Ubuntu 22.04 场景解析
  • Docker 部署 OpenClaw:Web UI 访问、飞书配对及自定义模型配置
  • Capacitor 跨平台打包工具实战指南
  • VS Code 集成 GitHub Copilot 配置与实战指南
  • Spring Integration Kafka XML 配置示例
  • 密集城市环境无人机空对地路径损耗研究与 Matlab 实现
  • RAG(检索增强生成)技术详解与应用实践
  • Git 团队开发全流程:从克隆到合并的最佳实践
  • OpenClaw Ubuntu 安装指南
  • FPGA 实现 CAN 总线原理与 Verilog 代码详解

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online