【spring boot】开发一个mybatis基于双数据源的分页插件

​单数据源的分页没什么说的用现成的pageHelper插件就可以了,而双数据源因为存在两个数据源方言差异的问题,已经无法通过pageHelper搞定,是时候自己搞一个分页插件了

在上次基于注解实现双数据源配置的基础上,我们在加上分页插件的功能

基本思路:

  • 利用拦截器拦截所有分页查询,判断当前数据源的方言
  • 根据方言拼装total查询sql查询当前查询的总条数
  • 根据方言拼装分页sql,实现分页查询
第一步:修改配置文件

在上次双数据源的配置文件中添加dialect参数,用于动态判断当前数据源方言

  datasource:
    db1:
      jdbc-url: jdbc:mysql://localhost:3306/mybatis-demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
      max-idle: 10
      max-wait: 10000
      min-idle: 5
      initial-size: 5
      dialect: mysql
    db2:
      jdbc-url: jdbc:mysql://localhost:3306/mybatis-demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
      max-idle: 10
      max-wait: 10000
      min-idle: 5
      initial-size: 5
      dialect: mysql
第二步:新建一个用于分页参数类PageParam.java
@Data
public class PageParam {
   
    public PageParam() {
   
        pageSize=0;
        pageNum=0;
        total = 0;
    }

    public PageParam(Integer pageNum, Integer pageSize) {
   
        this.pageNum = pageNum;
        this.pageSize = pageSize;
    }

    private Integer pageNum;
    //    默认每页显示条数
    private Integer pageSize;
    //    是否启用分页功能
    @JSONField(serialize = false)
    private Boolean useFlag;
    //    是否检测当前页码的合法性(大于最大页码或小于最小页码都不合法)
    @JSONField(serialize = false)
    private Boolean checkFlag;
    //当前sql查询的总记录数,回填
    private Integer total;
    //    当前sql查询实现分页后的总页数,回填
    private Integer totalPage;
    @JSONField(serialize = false)
    private String orderColumn;
    @JSONField(serialize = false)
    private String order;

    public Boolean isUseFlag() {
   
        return useFlag;
    }
    public Boolean istCheckFlag() {
   
        return checkFlag;
    }
}

第三步:新建pageConfig.java

用于数据源方言配置信息的加载及根据方言拼装分页相关的SQL语句

@Component
public class PageConfig {
   
    @Value("${spring.datasource.db1.dialect}")
    private String db1Dialect;
    @Value("${spring.datasource.db2.dialect}")
    private String db2Dialect;

    public String getDateSource() {
   
        return DataSourceContextHolder.getDB();
    }

    public static PageParam getPageParam(Integer pageNum, Integer pageSize) {
   
        if (pageSize == null || pageNum == null) {
   
            return null;
        }
        pageNum = pageNum > 0 ? pageNum : 1;
        pageSize = pageSize > 0 ? pageSize : 1;
        return new PageParam(pageNum, pageSize);
    }

    public static PageParam setPageParam(Integer pageNum, Integer pageSize, Map param) {
   
        PageParam pageParam = getPageParam(pageNum, pageSize);
        if (pageParam != null)
            param.put("pageParam", pageParam);
        return pageParam;
    }

    public String getDialect() {
   

        String dialect = getDialect(getDateSource());
        return dialect;
    }
    public String getDialect(String dbName){
   
        if(dbName.equals("db1"))
            return db1Dialect;
        else
            return db2Dialect;
    }

    public String getTotalSqlParam() {
   
        String sqlParma = " paging";
        if (getDialect().equals("postgre"))
            sqlParma = " as paging";
        else if (getDialect().equals("sqlserver")) {
   
            sqlParma = " as paging";
        }
        return sqlParma;
    }

    public String getSelectSqlParam(PageParam pageParam) {
   
        Map param =  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值