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;
    }
}
相关推荐
●VON6 小时前
鸿蒙Flutter实战:分类管理页BottomSheet CRUD
数据库·flutter·华为·harmonyos·鸿蒙
Cosolar6 小时前
Chroma向量库面试学习指南
数据库·人工智能·面试·职场和发展·数据库架构
企服AI产品测评局8 小时前
Agent适配信创环境实测:企业级自动化如何实现国产操作系统与数据库全兼容?
运维·数据库·人工智能·ai·chatgpt·自动化
cfm_29148 小时前
Redis数据安全性解析
数据库·redis·缓存
DIY源码阁8 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse
NiceCloud喜云9 小时前
Claude Code Routines 实战:三种触发器跑通云端自动化编码
android·运维·数据库·人工智能·自动化·json·飞书
辞忧九千七9 小时前
Redis 单机一主二从主从复制完整搭建指南
数据库·redis·缓存
lzhdim10 小时前
SQL 入门 16:SQL 事务隔离级别与死锁解析(易懂)
数据库·sql
AI 小老六11 小时前
Claude Code 如何压缩上下文:Microcompact、Prompt Cache 与 cache_edits 工程拆解
数据库·人工智能·ai·语言模型·架构·系统架构
Chasing__Dreams11 小时前
Redis--基础知识点--32--redis底层存储结构
数据库·redis·缓存