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
相关推荐
电魂泡哥10 分钟前
SQL出现filesort 一定慢吗
数据库·sql
Warson_L2 小时前
python - set/tuple/dict quiz
后端
IT_Octopus2 小时前
Spring Boot 实战:@PostConstruct + Caffeine 缓存初始化与定时刷新
spring boot·后端·缓存
swipe3 小时前
从本地开发到生产部署:用 Docker Compose 跑通 NestJS、MySQL 与 Milvus
后端·langchain·llm
码事漫谈3 小时前
SenseNova Skills Studio:为商汤SenseNova U1打造的本地办公技能包
后端
zhangxingchao3 小时前
AI应用开发七:可以替代 RAG 的技术
前端·人工智能·后端
Java面试题总结3 小时前
java高频面试题(2026最新)
java·开发语言·jvm·数据库·spring·缓存
苦逼的猿宝4 小时前
学生心理咨询评估系统
java·毕业设计·springboot·计算机毕业设计
隔窗听雨眠4 小时前
doctype、charset、meta如何控制整个渲染流水线
java·服务器·前端
牧羊狼的狼4 小时前
浅谈电商下单微服务流程
spring·spring cloud·微服务