【SpringBoot 3.x】整合Mybatis-Plus多数据源、Druid

本地开发环境说明

开发依赖版本
Spring Boot3.0.6
Mybatis-Plus3.5.3.1
dynamic-datasource-spring-boot-starter3.6.1
JDK20

pom.xml主要依赖

    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    </dependency>
    <!-- 根据需要修改数据库 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>
</dependencies>

application.yml主要配置

debug: true
logging:
  level:
    root: debug
    
spring:
  datasource:
    dynamic:
      # druid连接池设置
      druid:
        #     配置初始化大小、最小、最大线程数
        initialSize: 5
        minIdle: 5
        #     CPU核数+1,也可以大些但不要超过20,数据库加锁时连接过多性能下降
        maxActive: 20
        #     最大等待时间,内网:800,外网:1200(三次握手1s)
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        #     配置一个连接在池中最大空间时间,单位是毫秒
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1
        testWhileIdle: true
        #     设置从连接池获取连接时是否检查连接有效性,true检查,false不检查
        testOnBorrow: true
        #     设置从连接池归还连接时是否检查连接有效性,true检查,false不检查
        testOnReturn: true
        #     可以支持PSCache(提升写入、查询效率)
        poolPreparedStatements: true
        #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,slf4j
        #     保持长连接
        keepAlive: true
        maxPoolPreparedStatementPerConnectionSize: 20
        useGlobalDataSourceStat: true
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

        web-stat-filter:
          # 是否启用StatFilter默认值true
          enabled: true
          # 添加过滤规则
          url-pattern: /*
          # 忽略过滤的格式
          exclusions: /druid/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico

        stat-view-servlet:
          # 是否启用StatViewServlet默认值true
          enabled: true
          # 访问路径为/druid时,跳转到StatViewServlet
          url-pattern: /druid/*
          # 是否能够重置数据
          reset-enable: false
          # 需要账号密码才能访问控制台,默认为root
          login-username: druid
          login-password: druid
          # IP白名单
          allow: 127.0.0.1
          # IP黑名单(共同存在时,deny优先于allow)
          deny:
      #  dynamic主从设置
      primary: first  #设置默认的数据源或者数据源组,默认值即为master
      strict: false  #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源.
      datasource:
        first:
          driver-class-name: org.h2.Driver
          url: jdbc:h2:tcp://localhost/D:/ProgramFiles/h2database/data/test;MODE=MYSQL;
          username:
          password:
          type: com.alibaba.druid.pool.DruidDataSource
        second:
          driver-class-name: org.h2.Driver
          url: jdbc:h2:tcp://localhost/D:/ProgramFiles/h2database/data/test;MODE=MYSQL;
          username:
          password:
          type: com.alibaba.druid.pool.DruidDataSource

mybatis-plus:
  # 所有实体类所在包路径
  type-aliases-package: com.wen3.**.po
  # mapper.xmml文件路径,多个使用逗号分隔
  mapper-locations: classpath*:resources/mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

多数据源整合Druid

SpringBoot启动类修改

package com.wen3.demo.mybatisplus;

import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure;
import com.alibaba.druid.spring.boot3.autoconfigure.properties.DruidStatProperties;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@MapperScan(basePackages = "com.wen3.demo.mybatisplus.dao")
@SpringBootApplication(exclude = {
        DruidDataSourceAutoConfigure.class
})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
public class DemoMybatisplusApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoMybatisplusApplication.class, args);
    }
}

org.springframework.boot.autoconfigure.AutoConfiguration.imports

由于排除了DruidDataSourceAutoConfigure类的自动装载,就需要手工指定装配以下几个类

com.alibaba.druid.spring.boot3.autoconfigure.stat.DruidSpringAopConfiguration
com.alibaba.druid.spring.boot3.autoconfigure.stat.DruidStatViewServletConfiguration
com.alibaba.druid.spring.boot3.autoconfigure.stat.DruidWebStatFilterConfiguration
com.alibaba.druid.spring.boot3.autoconfigure.stat.DruidFilterConfiguration

查看DruidDataSourceAutoConfigure这个类的源码可以看出,需要把@Import带进来的几个类进行自动装配

@Configuration
@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {

}

Druid监控页面

在这里插入图片描述

可以看到多数据源已经配置成功了,并且加入了Druid监控

Junit单元测试

UserMapper.java

package com.wen3.demo.mybatisplus.dao;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wen3.demo.mybatisplus.po.UserPo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.Map;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @since 2023-05-21
 */
public interface UserMapper extends BaseMapper<UserPo> {

    @Select("select i.* from XXL_JOB_INFO i join XXL_JOB_GROUP g on i.job_group=g.id ${ew.customSqlSegment} ")
    Map<String,Object> multiTableQuery(@Param("ew") QueryWrapper<UserPo> query);
}

User2Mapper.java

package com.wen3.demo.mybatisplus.dao;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wen3.demo.mybatisplus.dao.UserMapper;
import com.wen3.demo.mybatisplus.po.UserPo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.Map;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author tangheng
 * @since 2023-05-21
 */
@DS("second")
public interface User2Mapper extends BaseMapper<UserPo> {

    @Select("select i.* from XXL_JOB_INFO i join XXL_JOB_GROUP g on i.job_group=g.id ${ew.customSqlSegment} ")
    Map<String,Object> multiTableQuery(@Param("ew") QueryWrapper<UserPo> query);
}

使用@DS注解指定使用的数据源,也可以放在Servie等其它类上,也可以放在具体类个方法上

User2MapperTest.java

package com.wen3.demo.mybatisplus.dao2;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wen3.demo.mybatisplus.MybatisPlusSpringbootTestBase;
import com.wen3.demo.mybatisplus.dao.User2Mapper;
import com.wen3.demo.mybatisplus.dao.UserMapper;
import com.wen3.demo.mybatisplus.po.UserPo;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Map;

class User2MapperTest extends MybatisPlusSpringbootTestBase {

    @Resource
    private User2Mapper user2Mapper;
    @Resource
    private UserMapper userMapper;

    @Test
    void testMultiTableQuery() {
        QueryWrapper<UserPo> queryWrapper = new QueryWrapper<>();
        Map<String, Object> testResult = userMapper.multiTableQuery(queryWrapper);
        Map<String, Object> testResult2 = user2Mapper.multiTableQuery(queryWrapper);
        assertEquals(testResult.size(), testResult2.size());
    }
}

单元测试运行日志

在这里插入图片描述

默认访问primary数据源

在这里插入图片描述

指定使用second数据源

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SpringBoot是一个高效的Java开发框架,它能够方便开发者集成MyBatis-Plus实现多数据源的动态切换以及支持分页查询。MyBatis-Plus是一种优秀的ORM框架,它增强了MyBatis的基础功能,并支持通过注解方式进行映射。 首先,我们需要在pom.xml文件中添加MyBatis-Plus和数据库连接池的依赖。在application.yml文件中,我们需要配置多个数据源和对应的连接信息。我们可以定义一个DataSourceConfig用于获取多个数据源,然后在Mapper配置类中使用@MapperScan(basePackages = {"com.test.mapper"})来扫描Mapper接口。 要实现动态切换数据源,我们可以自定义一个注解@DataSource来标注Mapper接口或方法,然后使用AOP拦截数据源切换,实现动态切换。在实现分页查询时,我们可以使用MyBatis-Plus提供的分页插件来支持分页查询。 代码示例: 1. 在pom.xml文件中添加MyBatis-Plus和数据库连接池的依赖。 ``` <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.4</version> </dependency> </dependencies> ``` 2. 在application.yml文件中配置多个数据源和对应的连接信息。以两个数据源为例: ``` spring: datasource: druid: db1: url: jdbc:mysql://localhost:3306/db1 username: root password: root driver-class-name: com.mysql.jdbc.Driver db2: url: jdbc:mysql://localhost:3306/db2 username: root password: root driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 指定默认数据源 primary: db1 ``` 3. 定义一个DataSourceConfig用于获取多个数据源。 ``` @Configuration public class DataSourceConfig { @Bean("db1") @ConfigurationProperties("spring.datasource.druid.db1") public DataSource dataSource1() { return DruidDataSourceBuilder.create().build(); } @Bean("db2") @ConfigurationProperties("spring.datasource.druid.db2") public DataSource dataSource2() { return DruidDataSourceBuilder.create().build(); } @Bean @Primary public DataSource dataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource(); // 设置数据源映射关系 Map<Object, Object> dataSourceMap = new HashMap<>(); dataSourceMap.put("db1", dataSource1()); dataSourceMap.put("db2", dataSource2()); dynamicDataSource.setTargetDataSources(dataSourceMap); // 设置默认数据源 dynamicDataSource.setDefaultTargetDataSource(dataSource1()); return dynamicDataSource; } } ``` 4. 在Mapper配置类中使用@MapperScan(basePackages = {"com.test.mapper"})来扫描Mapper接口,并使用@DataSource注解来标注Mapper接口或方法。 ``` @Configuration @MapperScan(basePackages = {"com.test.mapper"}) public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } } @DataSource("db1") public interface UserMapper { @Select("select * from user where id = #{id}") User selectById(@Param("id") Long id); } ``` 5. 实现AOP拦截数据源切换。 ``` @Aspect @Component public class DataSourceAspect { @Before("@annotation(ds)") public void beforeSwitchDataSource(JoinPoint point, DataSource ds) { String dataSource = ds.value(); if (!DynamicDataSourceContextHolder.containDataSourceKey(dataSource)) { System.err.println("数据源 " + dataSource + " 不存在,使用默认数据源"); } else { System.out.println("使用数据源:" + dataSource); DynamicDataSourceContextHolder.setDataSourceKey(dataSource); } } } ``` 6. 分页查询的使用示例: ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override @DataSource("db1") public IPage<User> getUserList(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); return userMapper.selectPage(page, null); } } ``` 以上就是SpringBoot整合MyBatis-Plus实现多数据源的动态切换和分页查询的具体实现过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太空眼睛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值