前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用PageHelper分页插件时,必须设置helper属性

使用PageHelper分页插件时,必须设置helper属性

原创
作者头像
胖五斤
修改2023-02-28 17:20:17
4.5K0
修改2023-02-28 17:20:17
举报

问题背景

  • 开发语言:Java
  • 插件版本:pagehelper:5.3.1,pagehelper-spring-boot:1.4.3
  • 问题描述:使用原生MySQL驱动时正常,使用某个第三方驱动(兼容mysql)时报错。 报错信息:
代码语言:javascript
复制
com.githubpagehelper.PageException: 使用PageHelper分页插件时,必须设置helper属性。

问题分析

  • 应用使用的是mybatis分页插件pagehelper,在不指定方言(dialect)的情况下会直接报错,报错是信息是使用pagehelper插件必须设置helper属性;
  • 尝试设置别名信息,同样会报错,设置如下:
代码语言:javascript
复制
pagehelper.helper-dialect=mysql
  • 可以通过代码指定的方式处理,但涉及改动程序,不推荐,例如:
代码语言:javascript
复制
PageHelper.startPage(page, limit).using("mysql");         
List list= mapper.list();         
PageInfo<U> pageInfo = new PageInfo<>(list);
  • 第三方驱动本身无问题
  • 怀疑是引入的插件包有问题

问题定位

  • 对比测试另一个系统,发现正常,没有对应的报错。
  • 对比2个系统中的配置,发现正常的系统,使用的是kebab-case风格;报错的系统,使用的是camelCase风格;
  • 下载helper源码进行分析,确定是插件本身问题:
  • 1.4.4版本修复了这个问题:

helper针对dialect的处理机制:默认它会通过配置的连接串用mysql去识别,换了连接串后,需要通过配置文件指定mysql。 配置文件的参数,有横线和驼峰的区别(1.4.4之前,有bug,只能识别驼峰式的配置);

代码语言:javascript
复制
public static AbstractHelperDialect instanceDialect(String dialectClass, Properties properties) {
    AbstractHelperDialect dialect;
    if (StringUtil.isEmpty(dialectClass)) {
        throw new PageException("使用 PageHelper 分页插件时,必须设置 helper 属性");
    }
代码语言:javascript
复制
public AbstractHelperDialect extractDialect(String dialectKey, MappedStatement ms, DataSource dataSource, Properties properties) {
    String dialect = PageAutoDialect.fromJdbcUrl(dialectKey);
    return PageAutoDialect.instanceDialect(dialect, properties);
}
代码语言:javascript
复制
public static String fromJdbcUrl(String jdbcUrl) {
    final String url = jdbcUrl.toLowerCase();
    for (String dialect : dialectAliasMap.keySet()) {
        if (url.contains(":" + dialect.toLowerCase() + ":")) {
            return dialect;
        }
    }
    return null;
}
代码语言:javascript
复制
static {
    //注册别名
    registerDialectAlias("hsqldb", HsqldbDialect.class);
    registerDialectAlias("h2", HsqldbDialect.class);
    registerDialectAlias("phoenix", HsqldbDialect.class);

    registerDialectAlias("postgresql", PostgreSqlDialect.class);

    registerDialectAlias("mysql", MySqlDialect.class);
    registerDialectAlias("mariadb", MySqlDialect.class);
    registerDialectAlias("sqlite", MySqlDialect.class);

    registerDialectAlias("herddb", HerdDBDialect.class);

    registerDialectAlias("oracle", OracleDialect.class);
    registerDialectAlias("oracle9i", Oracle9iDialect.class);
    registerDialectAlias("db2", Db2Dialect.class);
	...

可以看到,pagehelper默认是通过jdbc的url去自动识别dialect。例如mysql的,它会用":mysql:"去匹配有没有对应的dialect。 而第三方驱动的jdbc连接串用的是 ":xxxxx:",这个pagehelper默认是没有的,因此不能用自动识别。 要在配置文件中指定dialect,指定用mysql就可以了,是兼容的。 问题在于helper这个包,在1.4.4版本之前,它只能识别驼峰式配置。

解决办法

  1. 使用驼峰式配置参数
  2. 使用pagehelper 1.4.4以上版本

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题背景
  • 问题分析
  • 问题定位
  • 解决办法
相关产品与服务
TDSQL MySQL 版
TDSQL MySQL 版(TDSQL for MySQL)是腾讯打造的一款分布式数据库产品,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供完整的分布式数据库解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档