使用PageHelper分页插件时,必须设置helper属性
2023-06-13 09:15:23 时间
问题背景
- 开发语言:Java
- 插件版本:pagehelper:5.3.1,pagehelper-spring-boot:1.4.3
- 问题描述:使用原生MySQL驱动时正常,使用某个第三方驱动(兼容mysql)时报错。 报错信息:
com.githubpagehelper.PageException: 使用PageHelper分页插件时,必须设置helper属性。
问题分析
- 应用使用的是mybatis分页插件pagehelper,在不指定方言(dialect)的情况下会直接报错,报错是信息是使用pagehelper插件必须设置helper属性;
- 尝试设置别名信息,同样会报错,设置如下:
pagehelper.helper-dialect=mysql
- 可以通过代码指定的方式处理,但涉及改动程序,不推荐,例如:
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,只能识别驼峰式的配置);
public static AbstractHelperDialect instanceDialect(String dialectClass, Properties properties) {
AbstractHelperDialect dialect;
if (StringUtil.isEmpty(dialectClass)) {
throw new PageException("使用 PageHelper 分页插件时,必须设置 helper 属性");
}
public AbstractHelperDialect extractDialect(String dialectKey, MappedStatement ms, DataSource dataSource, Properties properties) {
String dialect = PageAutoDialect.fromJdbcUrl(dialectKey);
return PageAutoDialect.instanceDialect(dialect, properties);
}
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;
}
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版本之前,它只能识别驼峰式配置。
解决办法
- 使用驼峰式配置参数
- 使用pagehelper 1.4.4以上版本
相关文章
- 【说站】CSS简单常用属性的总结
- 反射getmethod参数_java通过反射获取属性值
- Garadle 插件扩展属性&源集SourceSets
- springboot jar包启动提示没有主清单属性
- 【Android Gradle 插件】CompileOptions 配置 ( BaseExtension#compileOptions 脚配块配置 | CompileOptions 属性配置 )
- 【Android Gradle 插件】DataBindingOptions 配置 ( BaseExtension#dataBinding 脚配块配置 | DataBindingOptions 属性)
- 【Android Gradle 插件】DexOptions 配置 ① ( BaseExtension#dexOptions 脚配块配置 | DexOptions 属性配置简介 )
- 【Android Gradle 插件】DexOptions 配置 ⑧ ( preDexLibraries 属性配置 | threadCount 属性配置 )
- 【Android Gradle 插件】LintOptions 配置 ⑪ ( textReport 属性配置 | textOutput 属性配置 )
- 【Android Gradle 插件】PackagingOptions 配置 ② ( PackagingOptions 默认配置简介 | pickFirsts 属性配置 )
- 【Android Gradle 插件】PackagingOptions 配置 ③ ( merges 属性配置 | excludes 属性配置 )
- 【Android Gradle 插件】Gradle 扩展属性 ④ ( 扩展属性访问方式 | 直接访问扩展属性 | 通过 ext 对象访问 | 在 gradle.properties 中定义扩展属性 )
- 【HTML5】HTML5 多媒体标签 ① ( audio 音频标签 | 音频标签常见属性值设置 | 音频标签默认代码设置 | 音频标签设置多种类型音频文件 )
- MySQL数值属性相减操作简介(MySQL两属性相减)
- 如何遍历对象的属性?
- JS中style属性
- 让低版本浏览器支持input的placeholder属性(js方法)
- JS通过分析userAgent属性来判断浏览器的类型及版本