解决pagehelper会把所有sql追加limit的问题
使用pagehelper遇到的问题
这个坑问题阻碍了我很久,记录一下,希望也能帮到同样遇到此问题的人。
问题描述
多模块工程中,只有其中某一个模块pom依赖了pagehelper,在其他模块sql根本没有调用startpage方法的情况下,会给整个工程的查询sql加上额外的limit,造成本来手动写limit的sql语句执行出错。
会出现类似下面的sql
SELECT * FROM system LIMIT ?,? LIMIT ?
造成此问题的原因还有很多,例如没有安全使用startpage,可以调用PageHelper.clearPage()方法清理线程。这里就不多介绍了,文章很多。
出现原因
在配置文件中加了supportMethodsArguments 配置,这个配置的官方介绍是支持通过Mapper接口参数来传递分页参数
注意: 官方介绍的不是特别清楚,其实这是个自动分页的配置,依据的是入参,如果参数中有pageNum,pageSize分页参数,则会自动分页
参数名称默认取:pageNum,pageSize
参数名称也可以自定义但是需要加配置
源码分析
在supportMethodsArguments设置为false后,sql拦截器判断是否需要分页那块会判断为否,跳过pagehelper的分页。
问题解决
直接去掉配置文件中的supportMethodsArguments,默认值为false,也可以设置为false。这样不会全局影响查询sql,然后可以在需要的地方把supportMethodsArguments设置为true。
例如:
/**
* 设置请求分页数据
*/
protected void startPage()
{
//在调用startpage之前把supportMethodsArguments设置为true
PageInterceptor pageInterceptor = new PageInterceptor();
Properties properties = new Properties();
properties.setProperty("supportMethodsArguments","true");
pageInterceptor.setProperties(properties);
PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
if (StringUtil.isNotNull(pageNum) && StringUtil.isNotNull(pageSize))
{
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
PageHelper.startPage(pageNum, pageSize, orderBy);
}
}