一:pagehelper介绍
PageHelper是一款基于MyBatis的分页插件,它简化了分页查询逻辑的编写,支持多种分页方式和结果集排序、筛选等操作。PageHelper的主要特点和功能包括:
1.无侵入性:使用PageHelper进行分页处理时,不需要修改原有的SQL语句、Mapper接口和XML文件,保持了MyBatis的原有使用习惯。2.易用性:通过引入相关依赖和简单的配置,即可实现分页功能,无需编写复杂的分页逻辑代码。
3.强大功能:支持多种数据库,能够处理复杂的分页查询功能,如排序、聚合查询、连表查询等。
4.高度自定义:提供了丰富的配置选项和自定义拦截器,可以根据实际需要进行灵活的设置。
PageHelper的工作原理主要依赖于拦截MyBatis的查询操作,在查询前设置分页参数,并在执行SQL语句时动态添加分页逻辑,从而实现分页查询。它通过修改当前执行的SQL语句来添加分页条件,执行添加了分页条件的SQL语句,最终返回分页后的结果集。
此外,PageHelper还提供了详细的配置选项和默认参数支持,如pagehelper.reasonable、pagehelper.defaultCount等,用户可以根据自己的需求进行配置。在整合PageHelper到项目中时,需要确保已经正确导入了MyBatis的依赖,并且按照官方文档的指引进行依赖的引入和配置。
总的来说,PageHelper是一款功能强大且易于使用的MyBatis分页插件,它大大简化了分页查询的实现过程,提高了开发效率,是Java项目中实现分页功能的常用工具之一。
二:pagehelper使用
2.1导入pagehelper依赖
<!--pagehelper分页插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> </dependency>
2.2在resources资源下配置application.yml配置文件
#配置分页插件 pagehelper: helper-dialect: mysql reasonable: true
helper-dialect:配置分页插件的方言即你使用的什么数据库则就用什么数据库
reasonable:true #开启合理查询:即若超过最大页跳到最后一页,若查询-1页,默认查询第一页
当然你也而可以在application.yml配置pagehelper的其他参数如下:
support-methods-arguments:支持通过Mapper接口参数来传递分页参数。
params:指定count查询的参数名称。
2.3 配置Mybatis
在application.yml文件下配置数据库相关文件
spring: # 配置mysql数据源 datasource: druid: username: root password: 123456 url: jdbc:mysql://192.168.xx.xx:3306/stock_db?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.jdbc.Driver # 初始化时建立物理连接的个数。初始化发生在显示调用 init 方法,或者第一次 getConnection 时 initialSize: 6 # 最小连接池数量 minIdle: 2 # 最大连接池数量 maxActive: 20 # 获取连接时最大等待时间,单位毫秒。配置了 maxWait 之后,缺省启用公平锁, # 并发效率会有所下降,如果需要可以通过配置 useUnfairLock 属性为 true 使用非公平锁。 maxWait: 60000 mybatis: mapper-locations: classpath:mapper/*.xml #配置加载mapper资源 configuration: map-underscore-to-camel-case: true #开启驼峰映射 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #通过mybatis执行的sql代码以日志的形式输出到终端 type-aliases-package: com.lcyy.stock.pojo #批量给实体类取别名,方便xml中直接使用别名,避免冗余配置
以上的mybatis的配置源,配置了mybatis的基本数据源,例如开启驼峰映射,配置记载mybatis的资源,并且使用了数据库连接池。
2.4编写Mapper和xml文件
为了实现pagehelper,定义一个用户信息的实体类
@Data @ApiModel("用户的基本信息封装") public class SysUser implements Serializable { /** * 用户id */ @ApiModelProperty(value = "用户主键ID") private Long id; /** * 账户 */ @ApiModelProperty(value = "用户的姓名") private String username; /** * 用户密码密文 */ @ApiModelProperty(value = "用户的密码") private String password; /** * 手机号码 */ @ApiModelProperty(value = "用户的手机号") private String phone; /** * 真实名称 */ @ApiModelProperty(value = "用户的真实姓名") private String realName; /** * 昵称 */ @ApiModelProperty(value = "用户的昵称") private String nickName; /** * 邮箱(唯一) */ @ApiModelProperty(value = "用户的邮箱并且是唯一的") private String email; /** * 账户状态(1.正常 2.锁定 ) */ @ApiModelProperty(value = "用户的账户状态:1是正常,2是锁定") private Integer status; /** * 性别(1.男 2.女) */ @ApiModelProperty(value = "用户的性别,1是男,2是女") private Integer sex; /** * 是否删除(1未删除;0已删除) */ @ApiModelProperty(value = "是否删除,1是未删除,0是已删除") private Integer deleted; /** * 创建人 */ @ApiModelProperty(value = "创建人是谁") private Long createId; /** * 更新人 */ @ApiModelProperty(value = "更新人是谁") private Long updateId; /** * 创建来源(1.web 2.android 3.ios ) */ @ApiModelProperty(value = "创建的来源,1是web,2是android,3是ios") private Integer createWhere; /** * 创建时间 */ @ApiModelProperty(value = "创建的时间") private Date createTime; /** * 更新时间 */ @ApiModelProperty(value = "更新的时间") private Date updateTime; @ApiModelProperty(value = "常量") private static final long serialVersionUID = 1L; }
对应的mapper接口如下:
/** * @author dlwlrma * @description 针对表【sys_user(用户表)】的数据库操作Mapper * @createDate 2024-06-18 21:48:00 * @Entity com.lcyy.stock.pojo.entity.SysUser */ public interface SysUserMapper { int deleteByPrimaryKey(Long id); int insert(SysUser record); int insertSelective(SysUser record); SysUser selectByPrimaryKey(Long id); int updateByPrimaryKeySelective(SysUser record); int updateByPrimaryKey(SysUser record); SysUser findUserInfoByUserName(@Param("userName") String userName); //查询所有信息 List<SysUser> findAll(); }
对用的测试类如下:
/** * @author: dlwlrma * @data 2024年06月22日 15:01 * @Description: TODO: 测试分页 */ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.lcyy.stock.mapper.SysUserMapper; import com.lcyy.stock.pojo.entity.SysUser; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest public class TestPageHelper { @Autowired private SysUserMapper sysUserMapper; @Test public void test01(){ //当前页 Integer page = 2; //当前页大小 Integer PageSize = 5; PageHelper.startPage(page,PageSize); List<SysUser> all1 = sysUserMapper.findAll(); //将查询到的all1对象封装到pageInfo中,可以查看分页的各种数据 PageInfo<SysUser> pageInfo = new PageInfo<>(all1); int pages = pageInfo.getPages(); int pageSize = pageInfo.getPageSize(); int size = pageInfo.getSize(); System.out.println(pages+"------"+pageSize+"----"+size); List<SysUser> all = all1; System.out.println(all); } }
在测试类我们就基本上实现了pagehelper的基本分页功能。
三:常见问题及解决方案
尽管PageHelper使用起来相对简单,但在实际应用中仍然可能遇到一些问题。以下是几个常见问题及其解决方法:
分页无效或查询结果为空
确保在调用分页查询方法前,已经正确调用了PageHelper.startPage方法。
检查数据库连接是否正常,SQL查询语句是否正确。
分页参数不生效
检查Controller层是否正确接收并传递了分页参数。
确保application.yml中配置的support-methods-arguments为true。
性能问题
对于大数据量的表,分页查询可能会带来性能问题。可以通过增加索引、优化SQL查询等方式提高性能。
四:总结
SpringBoot中正确集成PageHelper,帮助开发者避开常见误区,实现高效的分页查询功能。通过合理配置和正确使用PageHelper,我们可以在实际项目中轻松实现分页功能,提高开发效率。如果在使用过程中遇到问题,可以参考官方文档或相关技术社区寻求帮助。