当前位置: 首页 > news >正文

Java:采用mybatis+pagehealper优雅的实现分页功能

       在实现分页功能时,通常的做法是提供一个查总记录数据的SQL,再提供一个带分页参数的SQL,如果系统需要,可能还需要提供一个查全量记录的SQL。这种实现方式实在是繁琐,理想的实现方式是只提供一个查全量的SQL,分页功能自己能根据这这个基础的SQL生成查总记录数据的SQL和分页参数的SQL。pagehelper组件就能实现这样的功能,但是它需要结合mybatis一起使用。下面就实现一个简单的例子。

1.maven配置pom.xml

<dependency><groupId>org.mybatis.spring.boot<groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.2</version>
</dependency><dependency><groupId>com.github.pagehelper<groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version>
</dependency>

2.spring配置application.yaml

mybatis:mapper-locations: classpath:mapper/*.xmlconfiguration:logImpl: org.apache.ibatis.logging.slf4j.Slf4jImpl

3.mybatis配置roleInfo.mapper.xml

<mapper namespace="org.test.core.dao.RoleDao"><resultMap id="RoleInfo" type="org.test.core.model.RoleInfo"><result property="id" column="role_id" /><result property="name" column="role_name" /><result property="type" column="type" /><result property="state" column="state" /><result property="desc" column="description" /></resultMap><select id="getRoleInfoById" parameterType="string" resultMap="RoleInfo">select role_id, role_name, type, state, descriptionfrom t_rolewhere role_id = #{id}</select><select id="getRoleInfoByMap" parameterType="hashmap" resultMap="RoleInfo">select role_id, role_name, type, state, descriptionfrom t_role<where><if test="id != null and id != ''">and role_id = #{id}</if><if test="name != null and name != ''">and role_name = #{name}</if><if test="state != null and state != ''">and state = #{state}</if></select><select id="getRoleInfoByObj" parameterType="org.test.core.model.RoleInfo" resultMap="RoleInfo">select role_id, role_name, type, state, descriptionfrom t_role<where><if test="id != null and id != ''">and role_id = #{id}</if><if test="name != null and name != ''">and role_name = #{name}</if><if test="state != null and state != ''">and state = #{state}</if></select>
</mapper>

4.java代码

(1)RoleDao.java

import java.util.List;
import java.util.Map;import org.apache.ibatis.annotation.Param;public interface RoleDao {RoleInfo getRoleInfoById (@Param(value = "id") String roleId);List<RoleInfo> getRoleInfoByMap (Map<String, Object> map);List<RoleInfo> getRoleInfoByObj (RoleInfo roleInfo);}

(2)PagingKit

import java.util.List;
import java.util.Map;
import java.util.function.Function;import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;public class PagingKit {public static <T> PageInfo<T> makePageInfoUseMap(Map<String, Object> map, int pageNum, int pageSize, Function<Map<String, Object>, List<T>> query) {PageHelper.startPage(pageNum, pageSize);List<T> list = query.apply(map);PageInfo<T> pageInfo = new PageInfo<T>(list);return pageInfo;}public static <T> PageInfo<T> makePageInfoUseObj(T condition, int pageNum, int pageSize, Function<T, List<T>> query) {PageHelper.startPage(pageNum, pageSize);List<T> list = query.apply(condition);PageInfo<T> pageInfo = new PageInfo<T>(list);return pageInfo;}}

(3)HeathController.java

import java.util.HashMap;
import java.util.Map;import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import com.github.pagehelper.PageInfo;@Component
@Path("/sys")
public class HealthController {@Autowiredprivate RoleDao roleDao;@GET@Path("/role/{id}")@Produces({"application/json"})public RoleInfo getRoleById (@PathParam("id") String id) {return roleDao.getRoleInfoById(id);}@GET@Path("/role/byMap")@Produces({"application/json"})public RoleInfo pagingRoleByMap (@queryParam("pageNum") int pageNum, @queryParam("pageSize") int pageSize) {Map<String, Object> map = new HashMap<>();map.put("state", "0");map.put("name", "管理员");PageInfo<RoleInfo> pageInfo = PagingKit.makePageInfoUseMap(map, pageNum, pageSize, roleDao::getRoleInfoByMap); return pageInfo;}@GET@Path("/role/byObj")@Produces({"application/json"})public RoleInfo pagingRoleByObj (@queryParam("pageNum") int pageNum, @queryParam("pageSize") int pageSize) {RoleInfo  role = new RoleInfo();role.setState("0");role.setName("管理员");PageInfo<RoleInfo> pageInfo = PagingKit.makePageInfoUseObj(role, pageNum, pageSize, roleDao::getRoleInfoByObj); return pageInfo;}}

5.执行如果

可以查看日志

getRoleInfoByMap_COUNT|==>Preparing: select count(0) from (select role_id,role_name,type,state,description from t_role where role_name like "%"?"%" and state = ? ) tmp_count

getRoleInfoByMap_COUNT|==>Parameters: 管理员(String), 0(String)

getRoleInfoByMap_COUNT|==>   Total: 1

getRoleInfoByMap==>Preparing: select role_id,role_name,type,state,description from t_role where role_name like "%"?"%" and state = ? LIMIT ?,?

getRoleInfoByMap|==>Parameters: 管理员(String), 0(String), 3(Long),3(Integer)

getRoleInfoByMap|==>   Total: 1

http://www.lryc.cn/news/600981.html

相关文章:

  • 文件操作认识
  • connect系统调用及示例
  • 使用Python实现单词记忆软件
  • 零基础学习性能测试第三章:jmeter性能组件应用(事件,并发,定时器)
  • 大模型 vs 轻量模型:架构与使用场景对比
  • 单片机ADC机理层面详细分析(一)
  • nfls dp 刷题 题解
  • C++平衡二叉搜索树易错点
  • C++ 类型萃取:深入理解与实践
  • git推送文件失败
  • vulhub-earth靶机攻略
  • 显式等待和隐式等待的区别
  • 伟淼科技李志伟:破解二代接班传承困局,系统性方案破除三代魔咒
  • pytorch学习笔记-自定义卷积
  • Bert项目--新闻标题文本分类
  • C# 位运算及应用
  • 【简述】C++11/14/17/20/23 中的关键新特性
  • 无源域自适应综合研究【3】
  • ts-node 深入全面讲解
  • IntelliJ IDEA 的“缩短命令行”:解决长类路径的利器
  • 《Moco: Momentum Contrast for Unsupervised Visual Representation Learning》论文精读笔记
  • CentOS 7 安装 MySQL 8.4.6(二进制包)指南
  • 学习嵌入式的第三十一天-数据结构-(2025.7.23)网络协议封装
  • Houdini快速模拟烟雾
  • 从0开始学linux韦东山教程Linux驱动入门实验班(5)
  • ThreadLocal--ThreadLocal介绍
  • SGLang 核心技术详解
  • 20250726-3-Kubernetes 网络-Service三种常用类型_笔记
  • 创建 Vue 项目的 4 种主流方式
  • 嵌入式——C语言:指针②