druid多数据源+mybatis-plus的dynamic【一个简单例子】

主要利用dynamic来实现动态数据源

1 pom文件加依赖

<!--版本号-->
<properties>
    <mybatisplus.boot.version>3.1.0</mybatisplus.boot.version>
    <dynamic.datasource.boot.version>2.5.4</dynamic.datasource.boot.version>
    <druid-spring-boot.version>1.1.10</druid-spring-boot.version>
</properties>

<!-- 德鲁伊连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>${druid-spring-boot.version}</version>
</dependency>

<!--苞米豆的动态数据源-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>${dynamic.datasource.boot.version}</version>
</dependency>
        
<!--苞米豆的代码精简插件-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatisplus.boot.version}</version>
</dependency>

2 配置yml信息

dynamic包里面也有德鲁伊的配置信息,但是不是很多,主要是为了实现动态路由

连接池的信息一定要配置化再dynamic下面的一层,不然是不会生效的

数据源监控建议配置在datasource下面

server:
  port: 1234


spring:
  # 为了某些版本的springboot  @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class}) 无法生效
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
  datasource:
    dynamic:
      primary: db1 # 多数据源的情况下,主数据源(默认值master),可以自定义
      datasource:
        db1:
          url: jdbc:mysql://127.0.0.1:3306/photo?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&serverTimezone=Asia/Shanghai
          username: root
          password: 123456
          driverClassName:  com.mysql.cj.jdbc.Driver
        db2:
          url: jdbc:mysql://127.0.0.1:3306/photo2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&serverTimezone=Asia/Shanghai
          username: root
          password: 123456
          driverClassName:  com.mysql.cj.jdbc.Driver
      # 公共参数配置(连接池)
      druid:
        initial-size: 10
        max-active: 100
        min-idle: 10
        max-wait: 60000
        pool-prepared-statements: true
        max-pool-prepared-statement-per-connection-size: 20
        time-between-eviction-runs-millis: 60000
        min-evictable-idle-time-millis: 300000
        test-while-idle: true
        test-on-borrow: false
        test-on-return: false
    # 数据源监控配置
    druid:
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        login-username: druid
        login-password: 123456

也可以看一下监控信息http://127.0.0.1:1234/druid/datasource.html

在这里插入图片描述

3 配置数据库

就很简单的写了几个字段
db1
在这里插入图片描述
db2
在这里插入图片描述

4 配置代码

启动项上加上下面这个,就是去掉springboot自动配置数据源
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})

启动项目后默认是 primary指定的数据源db1

如果需要使用第二个数据库,只需要在mapper或者service类上配置@DS("db2")即可

mapper文件

@DS("db2")
public interface Photo2Mapper extends BaseMapper<PhotoEntity> {
    PhotoEntity selectOneById(String id);
}

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.lh.my.project.mapper.Photo2Mapper">

    <select id="selectOneById" resultType="cn.lh.my.project.entity.PhotoEntity">
        select id, cert_name, trade_id from batch_photo_202102 where id = #{id}
    </select>
</mapper>

service接口

@DS("db2")
public interface Photo2Service extends IService<PhotoEntity> {

    PhotoEntity selectOneById(String id);

}

impl文件

@Service
public class Photo2ServiceImpl extends ServiceImpl<Photo2Mapper, PhotoEntity>  implements Photo2Service {

    @Resource
    private Photo2Mapper photo2Mapper;

    @Override
    public PhotoEntity selectOneById(String id) {
        return photo2Mapper.selectOneById(id);
    }
}

test类测试一下

	@Autowired
    private PhotoService photoService;
    @Resource
    private PhotoMapper photoMapper;
    @Resource
    private Photo2Mapper photo2Mapper;
    @Autowired
    private Photo2Service photo2Service;
    
@Test
public void ds() {
	PhotoEntity photoEntity = photoMapper.selectById("333");
    log.info("数据库db1============={}", photoEntity.toString());

    PhotoEntity mapper = photo2Mapper.selectById("333");
    log.info("mapper============={}", mapper.toString());
    PhotoEntity plusMapper = photo2Mapper.selectOne(new QueryWrapper<PhotoEntity>().lambda().eq(PhotoEntity::getId, "333"));
    log.info("plusMapper============={}", plusMapper.toString());


    PhotoEntity service = photo2Service.selectOneById("333");
    log.info("service============={}", service.toString());
    PhotoEntity plusService = photo2Service.getOne(new QueryWrapper<PhotoEntity>().lambda().eq(PhotoEntity::getId, "333"));
    log.info("plusService============={}", plusService.toString());
}

结果如下

在这里插入图片描述
自定义sql和plus的代码都能使用第二个数据源

有什么不懂的评论区问吧

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Springboot+MyBatis-Plus实现多租户动态数据源模式是一种在Spring Boot框架下使用MyBatis-Plus插件实现多租户数据隔离的方法。它可以根据不同的租户动态切换数据源,实现不同租户之间的数据隔离。 实现多租户动态数据源模式的关键是配置多个数据源,并在运行时根据租户信息动态选择使用哪个数据源。以下是一个简单的示例代码: 1. 首先,需要在pom.xml文件中添加Druid数据源的依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.21</version> </dependency> ``` 2. 在application.properties或application.yml文件中配置多个数据源的连接信息,例如: ```yaml spring.datasource.master.url=jdbc:mysql://localhost:3306/master_db spring.datasource.master.username=root spring.datasource.master.password=123456 spring.datasource.tenant1.url=jdbc:mysql://localhost:3306/tenant1_db spring.datasource.tenant1.username=root spring.datasource.tenant1.password=123456 spring.datasource.tenant2.url=jdbc:mysql://localhost:3306/tenant2_db spring.datasource.tenant2.username=root spring.datasource.tenant2.password=123456 ``` 3. 创建一个多租户数据源配置类,用于动态选择数据源。可以使用ThreadLocal来保存当前租户的标识,然后根据标识选择对应的数据源。以下是一个简单的示例: ```java @Configuration public class MultiTenantDataSourceConfig { @Autowired private DataSourceProperties dataSourceProperties; @Bean @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.tenant1") public DataSource tenant1DataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.tenant2") public DataSource tenant2DataSource() { return DataSourceBuilder.create().build(); } @Bean @Primary public DataSource dynamicDataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource(); Map<Object, Object> dataSourceMap = new HashMap<>(); dataSourceMap.put("master", masterDataSource()); dataSourceMap.put("tenant1", tenant1DataSource()); dataSourceMap.put("tenant2", tenant2DataSource()); dynamicDataSource.setTargetDataSources(dataSourceMap); dynamicDataSource.setDefaultTargetDataSource(masterDataSource()); return dynamicDataSource; } @Bean public SqlSessionFactory sqlSessionFactory(DataSource dynamicDataSource) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dynamicDataSource); return sessionFactory.getObject(); } @Bean public PlatformTransactionManager transactionManager(DataSource dynamicDataSource) { return new DataSourceTransactionManager(dynamicDataSource); } } ``` 4. 创建一个多租户数据源切换器,用于在每次数据库操作前切换数据源。以下是一个简单的示例: ```java public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return TenantContext.getTenantId(); } } ``` 5. 创建一个租户上下文类,用于保存当前租户的标识。以下是一个简单的示例: ```java public class TenantContext { private static final ThreadLocal<String> CONTEXT = new ThreadLocal<>(); public static void setTenantId(String tenantId) { CONTEXT.set(tenantId); } public static String getTenantId() { return CONTEXT.get(); } public static void clear() { CONTEXT.remove(); } } ``` 6. 在需要切换数据源的地方,调用TenantContext.setTenantId()方法设置当前租户的标识。例如: ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public List<User> getUsers() { TenantContext.setTenantId("tenant1"); List<User> users = userService.getUsers(); TenantContext.clear(); return users; } } ``` 通过以上步骤,就可以实现Springboot+MyBatis-Plus的多租户动态数据源模式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值