使Mybatis-Plus支持Gbase8s(国产安全数据库)的分页查询方法

使Mybatis-Plus支持Gbase8s(国产安全数据库)的分页查询方法

所需如下

本教程实现mybatis-plus对Gbase8s的分页查询效果的支持,原生Mybatis-plusb不支持,比如:MySQL、Oracle,DB2等(测试发现Gbase8s好像支持DB2部分语法)。

具体mybatis-plus的源码版本

我使用的版本:
mybatis-plus版本:3.4.3.1

实现①方法如下所示:

  1. 从官网下载,当前的源码包***3.4.3.1,修改相应的源码,重新打jar包,放到本地maven仓库,引用其作为项目依赖。
这里有个问题,mybatis-plus源码是gradle项目,没有学习过gradle的同学,可能有点麻烦,本人目前学习中.... 
研究了好久发现,其实mybatis-plus源码是gradle项目有可以打包为maven包的插件
只要需改相应位置的源码,找到打包插件就可以打包为maven包,放到本地仓库,然后需要的项目直接使用修改的版本即可
  • mybatis-plus源代码是gradle项目打包为maven依赖的jar包方式:
    使Mybatis-Plus支持Gbase8s(国产安全数据库)的分页查询方法_第1张图片

  • 注:网上有很多方法,但改动都很大,改了好久也不好用,请使用最新版本的mybatis-plus源码包,最好项目使用的版本和你要修改的源码包版本一直,这样覆盖最小,省时省力

2.在下载的源码项目中重写同包同类名时,是需要修改mybatis-plus源代码中的相应类文件,在项目启动的过程中,则会优先加载项目里的代码而不是jar包里的(所以只适合与本地,但只是覆盖,不会改变源代码的哦)

3.在下载的源码项目中重写同包同类名文件,则要修改的mybatis-plus源码中的相应类文件,通过编译后替换解压的源代码中的class类文件,再重新打回jar包(适合本地或服务器,因为这是修改了源代码jar包)

方法②实现如下:

其实比较推荐的,因为要重写相应的类文件,所以要记得引入修改的源文件打的jar包(*对应你下载的源码的版本*)
  1. 目录如图
    使Mybatis-Plus支持Gbase8s(国产安全数据库)的分页查询方法_第2张图片

  2. 修改JdbcUtils工具类文件很关键,在url判断中增加GBASE8S判断类型如下

 else if (jdbcUrl.contains(":gbasedbt-sqli:")){
            return DbType.GBASE8S;
        }

使Mybatis-Plus支持Gbase8s(国产安全数据库)的分页查询方法_第3张图片

  1. 接下来要在DbType枚举类文件中增加对应值
/**
 * GBase8s
 */
GBASE8S("gbase8s", "南大通用安全数据库"),

使Mybatis-Plus支持Gbase8s(国产安全数据库)的分页查询方法_第4张图片

  1. 在接着新增一个方言实现类文件GBase8sDialect.java
public class GBase8sDialect implements IDialect {

    @Override
    public DialectModel buildPaginationSql(String originalSql, long offset, long limit) {
        Integer index = originalSql.toLowerCase().indexOf("select");
        StringBuilder sql = new StringBuilder(originalSql);
        sql.insert(index+6," SKIP " + FIRST_MARK + " FIRST " + SECOND_MARK + " ");
        return new DialectModel(sql.toString(), offset, limit).setConsumerChain();
    }


}

  1. 最后在DialectFactory工厂类文件中增加需要增加如下
	else if (dbType == DbType.GBASE8S) {
	                dialect = new GBase8sDialect();
	            }

使Mybatis-Plus支持Gbase8s(国产安全数据库)的分页查询方法_第5张图片

在此需要修改的类文件有 DbType、JdbcUtils、DialectFactory同时新增一个支持Gbase8s方言的类GBase8sDialect。
  1. 其实上述情况有存在一个小bug:就是当该分页查询有多于两个参数(即不止分页参数,还有条件查询参数)时,因为mp默认分页参数动态SQL参数匹配时都是在在最后面,而Gbase8s的分页参数则是最前面两个(感觉国产数据里有点奇葩,这个语法和之前用的DB2有点像,好像是和DB2有些渊源吧),所以出现分页参数位置匹配不正确的问题!当然,如果仅有Page里的两个分页参数则不影响分页查询。
  2. 具体的解决方法如下所示:
  • 具体的解决办法是:我们可以重写拦截器类PaginationInterceptor(com.baomidou.mybatisplus.extension.plugins),但调试了好久,没太搞清楚里面的的参数源码(源码学习有待加强),所以尝试了好久,直接用了一个笨拙的办法,就是修改参数位置吧 , 简单粗暴,直接在在拦截器类PaginationInterceptor中的beforeQuery方法中把参数List中最后两个参数放置到最前面:在model.consumers(mappings, configuration, additionalParameters)后加以下代码(大约在188行),这样就可以保证Gbase8s分页查询正常使用啦。
  • 为了更好的兼容其他家数据库,我对在对使用Gbase8s数据库做相应的判断,这样就不影响切换其他数据分页查询啦
    使Mybatis-Plus支持Gbase8s(国产安全数据库)的分页查询方法_第6张图片
  if(dbType.equals(DbType.GBASE8S)){
            mappings.add(0,mappings.get(mappings.size()-1));
            mappings.add(0,mappings.get(mappings.size()-2));
            mappings.remove(mappings.size()-1);
            mappings.remove(mappings.size()-1);
        }

实现效果如下

使Mybatis-Plus支持Gbase8s(国产安全数据库)的分页查询方法_第7张图片

  • 到此你就可以拿Gbase8s快乐的玩耍了

你可能感兴趣的:(数据库)