项目类型为springboot,使用了mybatis,切换数据库为dm后,项目启动正常,但进行分页查询时报错:

Caused by: com.github.pagehelper.PageException: 无法自动获取数据库类型,请通过 helperDialect 参数指定!
	at com.github.pagehelper.page.PageAutoDialect.getDialect(PageAutoDialect.java:206) ~[pagehelper-5.1.2.jar:na]
	at com.github.pagehelper.page.PageAutoDialect.initDelegateDialect(PageAutoDialect.java:90) ~[pagehelper-5.1.2.jar:na]
	at com.github.pagehelper.PageHelper.skip(PageHelper.java:65) ~[pagehelper-5.1.2.jar:na]
	at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:92) ~[pagehelper-5.1.2.jar:na]
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.3.jar:3.5.3]
	at com.sun.proxy.$Proxy259.query(Unknown Source) ~[na:na]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.3.jar:3.5.3]
	... 86 common frames omitted

摸索过程及错误思路略。

正确解决办法为在application.yml中配置:

pagehelper:
  dialect: com.github.pagehelper.dialect.helper.OracleDialect

至此,dm数据库中分页问题圆满解决。下面为源码分析:

在类PageInterceptor.java中尝试获取配置的方言pagehelper.dialect,如果获取失败,则用默认的方言PageHelper(汗!PageHelper是方言,而不是什么帮助类!)

    private Dialect dialect;
    private String default_dialect_class = "com.github.pagehelper.PageHelper";
    
    ......
    
    @Override
    public void setProperties(Properties properties) {
        ......
        String dialectClass = properties.getProperty("dialect");
        if (StringUtil.isEmpty(dialectClass)) {
            dialectClass = default_dialect_class;
        }
        try {
            Class<?> aClass = Class.forName(dialectClass);
            dialect = (Dialect) aClass.newInstance();
        } catch (Exception e) {
            throw new PageException(e);
        }
        dialect.setProperties(properties);
        ......
    }

后面更详细的代码分析略。

至于为什么指定的方言为oracleDialect,因为dm的分页方法与oracel一致啊~~~~~如果是与三大库不一样的,只能自己实现Dialect了,呵呵

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐