跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Java大前端java

MyBatisPlus 与 Thymeleaf 全栈分页整合方案

综述由AI生成基于 Spring Boot、MyBatisPlus 和 Thymeleaf 的全栈分页实现方案。内容包括环境搭建、实体类定义、业务层分页逻辑编写、控制层 API 设计以及前端表格与分页条的集成。重点讲解了 MyBatisPlus 分页插件的配置方法,解决了分页不展示等常见问题。通过具体代码示例展示了从后端数据查询到前端页面渲染的完整流程,适用于 Java 全栈开发场景。

HadoopMan发布于 2026/4/5更新于 2026/5/2229 浏览
MyBatisPlus 与 Thymeleaf 全栈分页整合方案

前言

分页功能是现代应用开发中不可或缺的一部分。通过 MyBatisPlus 和 Thymeleaf 的深度整合,可以实现一个高效、稳定的全栈分页解决方案。本文旨在介绍如何通过 Spring Boot 项目实现后端数据分页查询与前端页面渲染的对接。

一、MybatisPlus 搭建及表介绍

1、MybatisPlus 环境搭建

在 Maven 项目的 pom.xml 文件中引入 MyBatisPlus 依赖,同时集成 PostgreSQL 数据库驱动包和 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>

2、示例表结构介绍

以城市停水信息数据为例,表结构如下:

文章配图

对应的实例数据如下:

文章配图

二、Java 后台分页实现

1、实体类实现

定义 Java 实体类,使用 MyBatisPlus 注解映射数据库表:

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;
}

2、业务层分页实现

在业务接口中定义分页方法,使用 IPage 对象返回结果:

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

具体实现逻辑:

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

3、控制层实现

控制层接收前端参数,调用业务层方法并返回结果:

/**
 * - 获取分页数据
 * @param pageNum
 * @param pageSize
 * @param regionName
 * @return
 */
@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 分页集成

1、分页表格展示

在 HTML 中定义表格结构,并通过 AJAX 加载数据:

<div>
    <table>
        <thead>
            <tr>
                <th>创建时间</th>
                <th>停水地点</th>
                <th>原因</th>
            </tr>
        </thead>
        <tbody>
            <tr th:if="${#lists.isEmpty(waterEvents)}">
                <td colspan="3">请点击查询按钮加载数据。</td>
            </tr>
        </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="5">未找到符合条件的停水事件。</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="5">未找到符合条件的停水事件。</td></tr>`;
        }
    });
}

2、分页条集成

在网页中插入分页元素标签:

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

同步设置分页条逻辑(修复了原代码中的语法错误):

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

3、成果展示

最终效果展示如下:

文章配图

四、可能遇到的问题

1、分页不展示

如果页面显示所有数据且无分页条,可能是未正确配置分页插件。

2、问题解决

需要在后台配置好 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;
    }
}

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

五、总结

本文介绍了基于 Spring Boot、MyBatisPlus 和 Thymeleaf 的全栈分页实现方案。内容包括环境搭建、实体类定义、业务层分页逻辑编写、控制层 API 设计以及前端表格与分页条的集成。重点讲解了 MyBatisPlus 分页插件的配置方法,解决了分页不展示等常见问题。通过具体代码示例展示了从后端数据查询到前端页面渲染的完整流程。

目录

  1. 前言
  2. 一、MybatisPlus 搭建及表介绍
  3. 1、MybatisPlus 环境搭建
  4. 2、示例表结构介绍
  5. 二、Java 后台分页实现
  6. 1、实体类实现
  7. 2、业务层分页实现
  8. 3、控制层实现
  9. 三、Thymeleaf 分页集成
  10. 1、分页表格展示
  11. 2、分页条集成
  12. 3、成果展示
  13. 四、可能遇到的问题
  14. 1、分页不展示
  15. 2、问题解决
  16. 五、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • FastAPI+Python 前后端交互实战:用户登录注册与信息管理
  • 使用 ssprompt 工具生成小红书爆款文案
  • 前端开发:善用组件库,拒绝重复造轮子
  • 单点登录(SSO)架构原理与实战指南
  • WorkBuddy 接入 QQ 机器人配置指南
  • 解决 JPA 中 new Date() 插入数据库时间差 8 小时问题
  • 动态规划专题:子序列问题与 LIS 模型进阶
  • 国内升级 GitHub Copilot 专业版的有效支付方案
  • Python 爬虫实战:爬取豆瓣电影 Top250 数据
  • SpringBoot 手动开启数据库事务的几种实现方式
  • Linux 进程信号的产生机制详解
  • Ubuntu 下 libwebkit2gtk-4.1-0 安装指南
  • 语义化 AI 驱动器:提示词工程的技术演进与治理
  • 前端安全实战:防范 XSS、CSRF 及敏感信息泄露
  • Spring Boot 3.5.9 工程视角的稳健演进与核心价值
  • OpenClaw 配置飞书机器人指南
  • 阿里开源 iFlow CLI:终端级 AI 智能体初探
  • 2026年最新版 Dev C++ 下载安装与配置完整教程
  • 【论文阅读103】pinn-review-科学机器学习中的物理信息神经网络:现状与展望
  • 高性能 Go 缓存库 Ristretto:从算法原理到生产级架构实践

相关免费在线工具

  • 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