Mybatis-plus支持Gbase8s分页的实现示例

 更新时间:2021年11月09日 10:26:43   作者:枫雨血痕  
本文主要介绍了Mybatis-plus支持Gbase8s分页的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

需求

实现mybatis-plus对gbase8s的分页效果支持,使切换数据库(如oracle/mysql/gbase8s)时同样分页插件代码一样实现分页效果。

mybatis-plus版本:3.3.2

实现方法

修改Mybatis-plus源代码,重新打jar包,引用其作为项目依赖。

尴尬的是,mybatis-plus源码是gradle项目,目前没学习过,结果改好了源码不会打包…

在项目中重写同包同类名的要修改的mybatis-plus源码中的类,在项目启动中,会优先加载项目里的代码而不是jar包里的(适合本地,只覆盖,不改变源代码)

在项目中重写同包同类名的要修改的mybatis-plus源码中的类,编译后替换解压的源代码中的class文件,再重新打回jar包(适合本地/Linux服务器,修改了源代码jar包)

因为暂未接触gradle打包,所以本文介绍了方法2、方法3

法2实现

因为要重写类,所以记得引入原mybatis-plus的jar包依赖

目录如图

重写结构

修改JdbcUtils,在url判断中增加gbase8s判断

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

在这里插入图片描述

在DbType类中增加对应值

/**
 * GBase8s
 */
GBASE8S("gbase8s", "南大通用数据库"),

在这里插入图片描述

新增一个方言实现类GBase8sDialect

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();
    }


}

在DialectRegistry中增加

dialect_enum_map.put(DbType.GBASE8S, new GBase8sDialect());

在这里插入图片描述

合计需要修改的类有JdbcUtils、DialectRegistry、DbType,同时新增一个方言类GBase8sDialect。

20210423 修改完善

上述情况有一个小bug:就是当该分页查询有多于2个参数(即不止分页参数)时,因为mp默认分页参数动态SQL参数匹配时在最后面,而Gbase8s的分页参数是最前面两个,所以出现参数位置匹配不正确的问题!当然,如果仅有两个分页参数则不影响

解决方案如下:

  • 具体解决措施:重写拦截器类PaginationInterceptor(com.baomidou.mybatisplus.extension.plugins),因为没搞懂其参数添加源码,所以直接用了个笨办法,修改参数位置
  • 在intercept方法中把参数List中最后两个参数放置到最前面:在model.consumers(mappings, configuration, additionalParameters);后加以下代码(大约在213行)
	mappings.add(0,mappings.get(mappings.size()-2));
	mappings.add(0,mappings.get(mappings.size()-1));
	mappings.remove(mappings.size()-1);
	mappings.remove(mappings.size()-1);

20210519完善

之前的情况完全适用于Gbase8s,但如果考虑多数据库情况下,例切换到Oracle,会因为最后两个参数位置改变导致参数有误,所以再次完善,把之前0423增加的代码改为如下:

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);
        }

20210528完善

之前的代码在IDEA等本地开发环境上可以使用成功,但是当部署在Linux服务器上时,可能还是直接引用了mybatis-plus源代码,没有使用到编译后的覆盖内容,导致不支持gbase8s.完善内容原理如下:

  • 正常使用maven打包工具,项目打包后会有之前加入的覆盖代码编译后的各种class文件
  • 把mybatis-plus(以下简称mp)的原jar包解压(实际上只有两个要改:mybatis-plus-extension-3.3.2.jar和mybatis-plus-annotation-3.3.2.jar),然后把第一步中编译的覆盖内容class文件覆盖到解压后的源代码同路径下(重复的替换,新增的增加)
  • 把替换后的源代码重新打成jar包
    • //进入到源代码目录下,打开命令窗口,使用命令jar cvf xxx.jar *,会在当前目录下生成新的xxxjar包
    • 例:重新打mybatis-plus-extension-3.3.2.jar包
    • 进入解压后的mybatis-plus-extension-3.3.2目录(该目录下有com和META-INF文件夹),cmd打开命令窗口(路径为当前目录路径),使用命令jar cvf mybatis-plus-extension-3.3.2.jar *,会在当前目录下生成一个mybatis-plus-extension-3.3.2.jar包,把这个jar包替换maven库中的同名jar包即可!另一个jar包同理
  • 因为直接替换了源代码jar包,所以可以直接引用,同时可以把之前再项目例加的覆盖内容去了

到此这篇关于Mybatis-plus支持Gbase8s分页的实现示例的文章就介绍到这了,更多相关Mybatis-plus Gbase8s分页 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java获取某一日期的前N天(使用Calendar类)

    Java获取某一日期的前N天(使用Calendar类)

    这篇文章主要给大家介绍了关于Java如何使用Calendar类获取某一日期的前N天,我们可以使用Java中的Calendar类来获取前n天的时间,文中给出了详细的代码示例,需要的朋友可以参考下
    2023-08-08
  • Java中为什么不同的返回类型不算方法重载

    Java中为什么不同的返回类型不算方法重载

    这篇文章主要介绍了Java中为什么不同的返回类型不算方法重载,方法重载是指在同一个类中,定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是方法重载,下文详细介绍,需要的小伙伴可以参考一下
    2022-05-05
  • MyBatis分页插件PageHelper的具体使用

    MyBatis分页插件PageHelper的具体使用

    这篇文章主要介绍了MyBatis分页插件PageHelper的具体使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • SpringBoot全局配置long转String丢失精度问题解决方案

    SpringBoot全局配置long转String丢失精度问题解决方案

    这篇文章主要介绍了SpringBoot全局配置long转String丢失精度问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java开发SpringBoot集成接口文档实现示例

    Java开发SpringBoot集成接口文档实现示例

    这篇文章主要为大家介绍了Java开发SpringBoot如何集成接口文档的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • Spring Cloud Feign原理详解

    Spring Cloud Feign原理详解

    Feign 主要是帮助我们方便进行rest api服务间的调用,本文从Spring Cloud对feign封装的源码中去了解其主要实现机制
    2021-06-06
  • 浅谈Spring中Bean的作用域、生命周期

    浅谈Spring中Bean的作用域、生命周期

    这篇文章主要介绍了浅谈Spring中Bean的作用域、生命周期,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java中的volatile关键字原理深入解析

    Java中的volatile关键字原理深入解析

    这篇文章主要介绍了Java中的volatile关键字原理深入解析,volatile是Java 编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量,需要的朋友可以参考下
    2023-12-12
  • Java算法比赛常用方法实例总结

    Java算法比赛常用方法实例总结

    这篇文章主要给大家介绍了关于Java算法比赛常用方法实例总结的相关资料,文中给出了详细的实例介绍的非常详细,对大家学习java算法具有一定的参考学习价值,需要的朋友可以参考下
    2023-05-05
  • Java使用黑盒方式模拟实现内网穿透

    Java使用黑盒方式模拟实现内网穿透

    这篇文章主要介绍了Java使用黑盒方式模拟实现内网穿透,内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机,需要的朋友可以参考下
    2023-05-05

最新评论