mybatisplus多数据源中关于不同类型的(mysql,oracle)数据库分页问题解决

问题

由于某些原因,项目里面需要多数据源,且其中一个是mysql、另一个是oracle,项目里面使用了mybatisplus,看到了有关于多数据源的解决方案dynamic-datasource-spring-boot-starter,使用了该方案之后,发现查询oracle数据库时如果用到了mybatisplus的分页,也会使用如limit语句,但是oracle是不支持limit的,所以会报错

解决方案

那这个其实是关于数据库方言如何切换的问题,在mybatisplus中,需要配置一下分页拦截器

java 复制代码
@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {

    // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

可以看到这里是写了mysql,那我们如何让他既支持mysql,又支持oracle呢?

配置动态方言

java 复制代码
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.DialectFactory;
import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect;
import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
import org.apache.ibatis.executor.Executor;

public class AutoPaginationInnerInterceptor extends PaginationInnerInterceptor {
    
    @Override
    protected IDialect findIDialect(Executor executor) {
        // 首先尝试获取已经设置的方言
        IDialect dialect = super.findIDialect(executor);
        // 如果方言未设置,则根据数据库连接类型动态获取
        if (dialect == null) {
            return DialectFactory.getDialect(JdbcUtils.getDbType(executor));
        }
        return dialect;
    }
}
java 复制代码
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {

    // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new AutoPaginationInnerInterceptor());
        return interceptor;
    }
}
相关推荐
数据库小学妹12 分钟前
MySQL redo刷盘实测:innodb_flush_log_at_trx_commit与故障矩阵
运维·数据库·mysql
知码研习13 分钟前
Windows MySQL8.0.44 保姆级超详细安装配置教程(含 ZIP 免安装、MSI 图形安装、完整卸载流程)
mysql
ByteRock15 分钟前
ClickHouse 表的生老“并”死:表实例、表元数据与并发 DDL
数据库
哈__27 分钟前
破除数据库排障碎片化:一体化全链路故障根因诊断实践
数据库
严同学正在努力1 小时前
SQL Server 15.0.2000.5(2019 CU5)性能分析基线构建实战教程
数据库·ai·oracle·dba
MC丶科1 小时前
软考架构师90天冲刺|DAY44·Redis高级应用
数据库·数据仓库·redis·缓存·oracle·容器·规格说明书
Boop_wu1 小时前
[redis] redis 快速入门
数据库·redis·github
reasonsummer2 小时前
【办公类-115-01】20260906育儿知识(家园小报)批量制作(2026年9月-2027年6月)
开发语言·数据库·c#
AC赳赳老秦2 小时前
环保监测公开数据应用:OpenClaw 抓取空气与水质公开监测数据,开展区域环境质量趋势分析
大数据·数据库·人工智能·python·php·deepseek·openclaw
Zhu7583 小时前
部署安全的pg数据库,搭配pgadmin实现web界面管理
前端·数据库·安全