Mybatis Plus怎么配置双数据库驱动连接数据库
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本文小编为大家详细介绍"Mybatis Plus怎么配置双数据库驱动连接数据库",内容详细,步骤清晰,细节处理妥当,希望这篇"Mybatis Plus怎么配置双数据库驱动连接数据库"文章能帮助大家解决
千家信息网最后更新 2026年11月03日Mybatis Plus怎么配置双数据库驱动连接数据库
本文小编为大家详细介绍"Mybatis Plus怎么配置双数据库驱动连接数据库",内容详细,步骤清晰,细节处理妥当,希望这篇"Mybatis Plus怎么配置双数据库驱动连接数据库"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
具体实现
1、在pom.xml中添加如下依赖:
1.8 1.18.2 3.2.0 1.1.9 UTF-8 UTF-8 org.springframework.boot spring-boot-starter-web mysql mysql-connector-java runtime org.postgresql postgresql runtime com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} com.baomidou mybatis-plus ${mybatis-plus.version} org.projectlombok lombok ${lombok.version} com.alibaba druid-spring-boot-starter ${druid.version} org.springframework.boot spring-boot-starter-aop
2、在yml配置文件中添加如下配置:
server: port: 8080 spring: application: name: xxxx datasource: druid: # mysql数据源配置 db1: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/db1?useUnicode=true&characterEncoding=UTF-8&useSSL=false username: ${username} password: ${password} initial-size: 5 min-idle: 5 max-active: 50 # postgresql 数据源配置 db2: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://127.0.0.1:5432/db2?useUnicode=true&characterEncoding=utf-8 username: ${username} password: ${password} initial-size: 5 min-idle: 5 max-active: 50 # mybatis-plus配置mybatis-plus: type-aliases-package: com.dms.gateway.api.entity mapper-locations: classpath:/mapper/*Mapper.xml global-config: db-config: id-type: auto field-strategy: not_empty logic-delete-value: 1 logic-not-delete-value: 0 configuration: map-underscore-to-camel-case: true cache-enabled: false call-setters-on-nulls: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl3、新建DataSourceEnum枚举类,如下:
public enum DataSourceEnum { DB1("db1"), DB2("db2"); private String value; DataSourceEnum(String value){this.value=value;} public String getValue() { return value; }}4、新建DataSourceContextHolder类,如下:
public class DataSourceContextHolder { // 默认数据源 public static final String DEFAULT_DS = DataSourceEnum.DB1.getValue(); private static final ThreadLocal contextHolder = new InheritableThreadLocal<>(); /** * 设置数据源 * @param db */ public static void setDataSource(String db){ contextHolder.set(db); } /** * 取得当前数据源 * @return */ public static String getDataSource(){ return contextHolder.get(); } /** * 清除上下文数据 */ public static void clear(){ contextHolder.remove(); }} 5、新建MultipleDataSource类,如下:
public class MultipleDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSource(); }}6、新建DataSource注解,如下:
@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface DataSource { DataSourceEnum value() default DataSourceEnum.DB1;}7、新建面向类和方法级别的切面,如下:
@Component@Slf4j@Aspect@Order(-6)public class DataSourceClassAspect { @Before("@within(dataSource)") public void doBefore(JoinPoint point, DataSource dataSource){ log.info("切换到数据源[{}]", dataSource.value().getValue()); DataSourceContextHolder.setDataSource(dataSource.value().getValue()); } @After("@within(dataSource)") public void doAfter(JoinPoint point, DataSource dataSource){ log.info("回收数据源[{}]", dataSource.value().getValue()); DataSourceContextHolder.clear(); }}@Component@Slf4j@Aspect@Order(-5)public class DataSourceMethodAspect { @Before("@annotation(dataSource)") public void doBefore(JoinPoint point, DataSource dataSource){ log.info("切换到数据源[{}]", dataSource.value().getValue()); DataSourceContextHolder.setDataSource(dataSource.value().getValue()); } @After("@annotation(dataSource)") public void doAfter(JoinPoint point, DataSource dataSource){ log.info("回收数据源[{}]", dataSource.value().getValue()); DataSourceContextHolder.clear(); }}8、新建多数据源配置类,如下:
@Configuration@MapperScan("com.dms.gateway.api.mapper")public class MybatisPlusConfig { /* * 分页插件,自动识别数据库类型 * 多租户,请参考官网【插件扩展】 */ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); return paginationInterceptor; } @Bean(name = "db1") @ConfigurationProperties(prefix = "spring.datasource.druid.db1" ) public DataSource db1() { return DruidDataSourceBuilder.create().build(); } @Bean(name = "db2") @ConfigurationProperties(prefix = "spring.datasource.druid.db2" ) public DataSource db2() { return DruidDataSourceBuilder.create().build(); } /** * 动态数据源配置 * @return */ @Bean @Primary public DataSource multipleDataSource(@Qualifier("db1") DataSource db1, @Qualifier("db2") DataSource db2) { MultipleDataSource multipleDataSource = new MultipleDataSource(); Map< Object, Object > targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceEnum.DB1.getValue(), db1); targetDataSources.put(DataSourceEnum.DB2.getValue(), db2); //添加数据源 multipleDataSource.setTargetDataSources(targetDataSources); //设置默认数据源 multipleDataSource.setDefaultTargetDataSource(db1); return multipleDataSource; } @Bean("sqlSessionFactory") public SqlSessionFactory sqlSessionFactory() throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(); sqlSessionFactory.setDataSource(multipleDataSource(db1(),db2())); MybatisConfiguration configuration = new MybatisConfiguration(); configuration.setJdbcTypeForNull(JdbcType.NULL); configuration.setMapUnderscoreToCamelCase(true); configuration.setCacheEnabled(false); sqlSessionFactory.setConfiguration(configuration); //添加分页功能 sqlSessionFactory.setPlugins(paginationInterceptor()); return sqlSessionFactory.getObject(); }}接下来需要具体的业务逻辑,在service层的类或者方法上面添加@DataSource注解来指定该业务需要用到的数据源,如下:
@Service@DataSource(DataSourceEnum.DB2)public class GatewayLogService { @Autowired private GatewayLogMapper mapper; @Override public Result> pageList(GatewayLogDTO gatewayLogDTO) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.like(StringUtils.isNotEmpty(gatewayLogDTO.getPath()), GatewayLog::getPath, gatewayLogDTO.getPath()); wrapper.like(StringUtils.isNotEmpty(gatewayLogDTO.getSourceServer()), GatewayLog::getSourceServer, gatewayLogDTO.getSourceServer()); wrapper.like(StringUtils.isNotEmpty(gatewayLogDTO.getTargetServer()), GatewayLog::getTargetServer, gatewayLogDTO.getTargetServer()); wrapper.eq(StringUtils.isNotEmpty(gatewayLogDTO.getMethod()), GatewayLog::getMethod, gatewayLogDTO.getMethod()); wrapper.like(StringUtils.isNotEmpty(gatewayLogDTO.getRequestBody()), GatewayLog::getRequestBody, gatewayLogDTO.getRequestBody()); wrapper.like(StringUtils.isNotEmpty(gatewayLogDTO.getResponse()), GatewayLog::getResponse, gatewayLogDTO.getResponse()); wrapper.orderByDesc(GatewayLog::getId); IPage page = new Page<>(gatewayLogDTO.getPageNo(), gatewayLogDTO.getPageSize()); return Result.success(mapper.selectPage(page, wrapper)); } } 启动服务,调用相关的接口,我们会在控制台看到如下信息:

说明数据源切换成功!!!
读到这里,这篇"Mybatis Plus怎么配置双数据库驱动连接数据库"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
数据
数据源
配置
数据库
驱动
文章
切换
业务
内容
插件
方法
注解
UTF-8
妥当
成功
接下来
上下
上下文
信息
切面
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
保险科技 互联网保险
华服互联网科技靠谱吗
科技和互联网公司
互联网科技卖菜
善班互联网科技
互联网科技革命
奇酷互联网络科技
未来的互联网科技
成都仁贤领冠互联网科技有限公司
阿里巴巴算科技企业还是互联网
央行互联网金融科技公司
科技与互联网哪个更好
黑科技闪耀互联网之光
互联网5g黑科技有哪些
恒生互联网科技指数跳水
怎样加入科技互联网
福建互联网展示科技馆设计
互联网科技职业技能培训学校
好易买互联网科技
颐高云石互联网科技
云之行互联网科技
为想互联网科技怎么样
智网互联网科技
佰商互联网科技有限公司
互联网和高科技公司
中科明德北京互联网科技
智帮互联网科技公司最近动向
互联网领先科技宣传片
广州有谷有贝互联网科技有限公司
安徽零酒互联网科技有限公司