Spring Boot - Spring Boot 集成 MyBatis 分页实现 手写 SQL 分页

一、准备阶段

1、依赖引入
  • pom.xml
xml 复制代码
<properties>

    ...

    <postgresql.verison>42.5.6</postgresql.verison>
    <mybatis.version>3.0.1</mybatis.version>
</properties>
xml 复制代码
<dependencies>

    ...

    <!-- postgresql 驱动 -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>${postgresql.verison}</version>
    </dependency>

    <!-- mybatis 和 springboot 整合的起步依赖 -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis.version}</version>
    </dependency>
</dependencies>
2、配置文件
  1. application.yml
yml 复制代码
mybatis:
  mapper-locations: classpath:/mapper/*.xml # 映射文件路径
  config-location: classpath:/mybatis-config.xml # 核心配置文件路径
  1. mybatis-config.xml
xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC
        "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>

        <!-- 设置驼峰标识 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>

        <!-- 打印 SQL 语句 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>
3、准备数据
  1. 创建数据表
sql 复制代码
CREATE TABLE staff (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    role VARCHAR(255),
    salary DECIMAL(10, 2)
);
  1. 插入数据
sql 复制代码
INSERT INTO staff (name, role, salary) VALUES
('张三', '项目经理', 25000.00),
('李四', '高级开发工程师', 18000.00),
('王五', '开发工程师', 15000.00),
('赵六', '测试工程师', 12000.00),
('钱七', 'UI设计师', 13000.00),
('孙八', '产品经理', 20000.00),
('周九', '运维工程师', 14000.00),
('吴十', '初级开发工程师', 10000.00),
('郑十一', '数据库管理员', 16000.00),
('王十二', '技术总监', 30000.00);

二、手写 SQL 分页实现

1、XML 方式
(1)Mapper
  1. StaffMapper.java
java 复制代码
@Mapper
public interface StaffMapper {
    List<Staff> queryStaffs(int offset, int pageSize);

    Integer countStaffs();
}
  1. StaffMapper.xml
xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="com.my.mapper.StaffMapper">

    <resultMap id="staffResultMap" type="com.my.model.db.Staff">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="role" property="role"/>
        <result column="salary" property="salary"/>
    </resultMap>

    <select id="queryStaffs" resultMap="staffResultMap">
        SELECT *
        FROM staff LIMIT #{pageSize}
        OFFSET #{offset}
    </select>
    
    <select id="countStaffs" resultType="int">
        SELECT COUNT(*)
        FROM staff
    </select>
</mapper>
(2)Test
java 复制代码
// 分页参数计算
int pageNum = 2; // 当前页码
int pageSize = 2; // 每页条数
int offset = (pageNum - 1) * pageSize;

List<Staff> staffs = staffMapper.queryStaffs(offset, pageSize);
int total = staffMapper.countStaffs();
int pageTotal = (int) Math.ceil((double) total / pageSize);

for (Staff staff : staffs) {
    System.out.println(staff);
}

System.out.println("pageNum: " + pageNum);
System.out.println("pageSize: " + pageSize);
System.out.println("pageTotal: " + pageTotal);
System.out.println("total: " + total);
复制代码
# 输出结果

Staff(id=5, name=王五, role=开发工程师, salary=15000.0)
Staff(id=6, name=赵六, role=测试工程师, salary=12000.0)
pageNum: 2
pageSize: 2
pageTotal: 5
total: 10
2、注解方式
(1)Mapper
  • StaffMapper.java
java 复制代码
@Select("SELECT * FROM staff ORDER BY id LIMIT #{pageSize} OFFSET #{offset}")
List<Staff> queryStaffs(int offset, int pageSize);

@Select("SELECT COUNT(*) FROM staff")
Integer countStaffs();
(2)Test
java 复制代码
// 分页参数计算
int pageNum = 2; // 当前页码
int pageSize = 2; // 每页条数
int offset = (pageNum - 1) * pageSize;

List<Staff> staffs = staffMapper.queryStaffs(offset, pageSize);
int total = staffMapper.countStaffs();
int pageTotal = (int) Math.ceil((double) total / pageSize);

for (Staff staff : staffs) {
    System.out.println(staff);
}

System.out.println("pageNum: " + pageNum);
System.out.println("pageSize: " + pageSize);
System.out.println("pageTotal: " + pageTotal);
System.out.println("total: " + total);
复制代码
# 输出结果

Staff(id=5, name=王五, role=开发工程师, salary=15000.0)
Staff(id=6, name=赵六, role=测试工程师, salary=12000.0)
pageNum: 2
pageSize: 2
pageTotal: 5
total: 10

三、手写 SQL 分页实现封装

1、Entity
  • PageResult.java
java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult<T> {
    private List<T> data;
    private Integer pageNum;
    private Integer pageSize;
    private Integer pageTotal;
    private Integer total;
}
2、Mapper
  • StaffMapper.java
java 复制代码
@Select("SELECT * FROM staff ORDER BY id LIMIT #{pageSize} OFFSET #{offset}")
List<Staff> queryStaffs(int offset, int pageSize);

@Select("SELECT COUNT(*) FROM staff")
Integer countStaffs();
3、Service
  1. StaffService.java
java 复制代码
public interface StaffService {
    PageResult<Staff> queryStaffs(int pageNum, int pageSize);
}
  1. StaffServiceImpl.java
java 复制代码
@Service
public class StaffServiceImpl implements StaffService {

    @Autowired
    private StaffMapper staffMapper;

    @Override
    public PageResult<Staff> queryStaffs(int pageNum, int pageSize) {

        int offset = (pageNum - 1) * pageSize;

        List<Staff> staffs = staffMapper.queryStaffs(offset, pageSize);
        int total = staffMapper.countStaffs();
        int pageTotal = (int) Math.ceil((double) total / pageSize);

        return new PageResult<>(staffs, pageNum, pageSize, pageTotal, total);
    }
}
4、Test
java 复制代码
PageResult<Staff> staffPageResult = staffService.queryStaffs(1, 5);

List<Staff> staffs = staffPageResult.getData();
int pageNum = staffPageResult.getPageNum();
int pageSize = staffPageResult.getPageSize();
int pageTotal = staffPageResult.getPageTotal();
int total = staffPageResult.getTotal();

for (Staff staff : staffs) {
    System.out.println(staff);
}

System.out.println("pageNum: " + pageNum);
System.out.println("pageSize: " + pageSize);
System.out.println("pageTotal: " + pageTotal);
System.out.println("total: " + total);
复制代码
# 输出结果

Staff(id=3, name=张三, role=项目经理, salary=25000.0)
Staff(id=4, name=李四, role=高级开发工程师, salary=18000.0)
Staff(id=5, name=王五, role=开发工程师, salary=15000.0)
Staff(id=6, name=赵六, role=测试工程师, salary=12000.0)
Staff(id=7, name=钱七, role=UI设计师, salary=13000.0)
pageNum: 1
pageSize: 5
pageTotal: 2
total: 10
相关推荐
CodeCaptain7 分钟前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud
源代码•宸1 小时前
大厂技术岗面试之谈薪资
经验分享·后端·面试·职场和发展·golang·大厂·职级水平的薪资
Anastasiozzzz1 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人1 小时前
通过脚本推送Docker镜像
java·docker·容器
韩立学长1 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
铁蛋AI编程实战1 小时前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
晚霞的不甘1 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
SunnyDays10112 小时前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列
喵叔哟2 小时前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
摇滚侠2 小时前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea