网上的教程有个问题,就是limit分页的两个参数永远在最后。

最终代码


/**
 * @author zongjy
 * @date 2022/10/19 17:39
 **/
@Component
public class MySqlDialectCustom extends MySqlDialect {
    final String limit = "/*limit*/";
    @Override
    public Object processPageParameter(MappedStatement ms, Map<String, Object> paramMap, Page page, BoundSql boundSql, CacheKey pageKey) {
        paramMap.put(PAGEPARAMETER_FIRST, page.getStartRow());
        paramMap.put(PAGEPARAMETER_SECOND, page.getPageSize());
        //处理pageKey
        pageKey.update(page.getStartRow());
        pageKey.update(page.getPageSize());
        //处理参数配置
        if (boundSql.getParameterMappings() != null) {
            List<ParameterMapping> newParameterMappings = new ArrayList<ParameterMapping>(boundSql.getParameterMappings());
            if (boundSql.getSql().contains(limit)) {
                //自定义分页 不注入分页变量
            } else if (page.getStartRow() == 0) {
                newParameterMappings.add(new ParameterMapping.Builder(ms.getConfiguration(), PAGEPARAMETER_SECOND, int.class).build());
            } else {
                newParameterMappings.add(new ParameterMapping.Builder(ms.getConfiguration(), PAGEPARAMETER_FIRST, long.class).build());
                newParameterMappings.add(new ParameterMapping.Builder(ms.getConfiguration(), PAGEPARAMETER_SECOND, int.class).build());
            }

            MetaObject metaObject = MetaObjectUtil.forObject(boundSql);
            metaObject.setValue("parameterMappings", newParameterMappings);
        }
        return paramMap;
    }

    @Override
    public String getPageSql(String sql, Page page, CacheKey pageKey) {

        //System.out.println("走自定义分页");
        if (sql.contains(limit)) {
            if (page.getStartRow() == 0) {
                sql = sql.replace(limit, " LIMIT "+page.getStartRow());
            } else {
                sql = sql.replace(limit, " LIMIT "+page.getStartRow()+","+page.getPageSize());
            }
            return sql;
        }

        return super.getPageSql(sql, page, pageKey);
    }

}

同时配置类增加如下内容,注意helperDialect不可写成helper-dialect,否则无效

pagehelper:
  helperDialect: cc.xx.configs.MySqlDialectCustom
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐