目录

pagehelper适配国产数据库

pagehelper适配国产数据库

一.国产数据库介绍

国产数据库基本上都是山寨版的数据库,例如人大金仓数据库,山寨postgresql数据库,有些则山寨mysql、oracle等数据库。所以在适配过程中,只要了解到使用的国产数据库是山寨的那一种数据库,则遇到的问题就迎刃而解。

一.分页插件源码分析

分页插件在未指定方言的情况下,会通过数据库的URL取其数据库类型做自动方言匹配。如下图:

https://i-blog.csdnimg.cn/blog_migrate/cf3913b8038803f4fb4acef2f7e9d8de.png

分页插件数据库方言自动匹配源码如下:

静态块会在类加载时,注册数据库方言的分页处理类。注册的别名则与上图数据库url红框圈中部分匹配(配置文件未设置方言时)。

public class PageAutoDialect {

    private static Map<String, Class<? extends Dialect>> dialectAliasMap = new HashMap<String, Class<? extends Dialect>>();

    public static void registerDialectAlias(String alias, Class<? extends Dialect> dialectClass){
        dialectAliasMap.put(alias, dialectClass);
    }

    static {
        //注册别名
        registerDialectAlias("hsqldb", HsqldbDialect.class);
        registerDialectAlias("h2", HsqldbDialect.class);
        registerDialectAlias("postgresql", HsqldbDialect.class);
        registerDialectAlias("phoenix", HsqldbDialect.class);

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

        registerDialectAlias("oracle", OracleDialect.class);
        registerDialectAlias("db2", Db2Dialect.class);
        registerDialectAlias("informix", InformixDialect.class);
        //解决 informix-sqli #129,仍然保留上面的
        registerDialectAlias("informix-sqli", InformixDialect.class);

        registerDialectAlias("sqlserver", SqlServerDialect.class);
        registerDialectAlias("sqlserver2012", SqlServer2012Dialect.class);

        registerDialectAlias("derby", SqlServer2012Dialect.class);
        //达梦数据库,https://github.com/mybatis-book/book/issues/43
        registerDialectAlias("dm", OracleDialect.class);
    }

三.解决方案

从注册的数据中可看出,人大金仓数据库并未注册,所以需要我们手动添加。以下为我的代码处理,由于人大金仓数据库为postgresql的山寨版,按照以上代码中postgresql的注册代码“

registerDialectAlias("postgresql", HsqldbDialect.class);

”,将key值改为人大金仓,在springboot的config配置中,注册一下即可


@Configuration
public class MybatisDialectConfig {

    @Bean
    public void MyBatisDialectBean()
    {
        PageAutoDialect.registerDialectAlias("kingbase8", HsqldbDialect.class);
    }

}

注释掉配置文件中分页插件配置的“helperDialect”属性,可自动匹配数据库。

https://i-blog.csdnimg.cn/blog_migrate/a4801df8d87b4723f31add09f26bd1d4.png