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
相关推荐
C4程序员8 分钟前
北京JAVA基础面试30天打卡03
java·开发语言·面试
姑苏洛言1 小时前
扫码点餐小程序产品需求分析与功能梳理
前端·javascript·后端
Java技术小馆1 小时前
PromptPilot打造高效AI提示词
java·后端·面试
whysqwhw1 小时前
线程池数量配置
java
2501_916766541 小时前
【Mybatis入门】配置Mybatis(IDEA)
mybatis
陈陈陈同学242 小时前
Vercel迁移到Dokploy自部署,每月立省20刀
后端·node.js
计算机毕设定制辅导-无忧学长2 小时前
InfluxDB 权限管理与安全加固(一)
java·struts·安全
老华带你飞2 小时前
生产管理ERP系统|物联及生产管理ERP系统|基于SprinBoot+vue的制造装备物联及生产管理ERP系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·论文·制造·毕设·生产管理erp系统
简放2 小时前
智能机票助手-接入Ollama本地模型-Spring-AI-Alibaba
spring boot·langchain·ollama
一勺-_-2 小时前
全栈:如何判断自己应该下载哪个版本的Tomcat
java·tomcat