多数据源,同时使用Mybatis-Plus和Druid时的坑

如果你要使用Mybatis-plus的多数据源功能,首先要引入以下依赖:

		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.2</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>2.5.4</version>
        </dependency>

如果你要使用Druid,要引入:

		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

在这里我们使用MySQL数据库,引入驱动:

		<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>5.1.6</scope>
        </dependency>

我们在application.yml文件里进行多数据源配置:

spring:
  datasource:
    dynamic:
      primary: master
      datasource:
        master:
          url: jdbc:mysql://xx:3306/DD.contract
          username: 
          password: 
          driver-class-name: com.mysql.jdbc.Driver
        slave:
          url: jdbc:mysql://:3306/ctpc
          username: 
          password: 
          driver-class-name: com.mysql.jdbc.Driver
      druid:
        keep-alive: true

其中的primary属性表明了我们要以下面哪一个数据库为主,主数据库在不进行 @DS切换的时候默认使用。

然后你启动就会发现,提示你根本没有配置数据库!

这应该是因为Druid的自动配置识别不到以上配置。于是我们选择关闭Druid的自动配置。

@SpringBootApplication(
        scanBasePackages ={"com.ynunicom.dc.dingdingcontractapp"},
        exclude = DruidDataSourceAutoConfigure.class
)
public class DingdingContractAppApplication {
    public static void main(String[] args) {
        SpringApplication.run(DingdingContractAppApplication.class, args);
    }
}

我们把DruidDataSourceAutoConfigure.class给排除在外,我们刚刚引入的dynamic-datasource-spring-boot-starter里面所携带的DynamicDataSourceAutoConfiguration就生效了,它里面有这个东西:
在这里插入图片描述
如果你不把Druid的自动配置关闭,则这个东西会被DruiddataSource给覆盖,以下是Druid的自动配置类DruidDataSourceAutoConfigure中的内容:

去除Druid的自动配置后,服务就可以正常跑起来了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MybatisPlus可以通过配置多个数据源来实现对多个数据库的访问,同也可以使用Druid作为数据源连接池。下面是一个使用Druid多数据源MybatisPlus配置示例: 1. 引入DruidMybatisPlus的依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> ``` 2. 配置数据源连接池,并定义多个数据源: ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties("spring.datasource.druid.master") public DruidDataSource masterDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties("spring.datasource.druid.slave") public DruidDataSource slaveDataSource() { return DruidDataSourceBuilder.create().build(); } @Primary @Bean(name = "master") public DataSource master(@Qualifier("masterDataSource") DruidDataSource dataSource) { return dataSource; } @Bean(name = "slave") public DataSource slave(@Qualifier("slaveDataSource") DruidDataSource dataSource) { return dataSource; } } ``` 3. 配置MybatisPlus的SqlSessionFactory,指定要使用的数据源: ```java @Configuration @MapperScan(basePackages = {"com.example.mapper"}) public class MybatisPlusConfig { @Autowired @Qualifier("master") private DataSource masterDataSource; @Autowired @Qualifier("slave") private DataSource slaveDataSource; @Bean public SqlSessionFactory masterSqlSessionFactory() throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(masterDataSource); return factoryBean.getObject(); } @Bean public SqlSessionFactory slaveSqlSessionFactory() throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(slaveDataSource); return factoryBean.getObject(); } @Bean(name = "masterSqlSessionTemplate") public SqlSessionTemplate masterSqlSessionTemplate(SqlSessionFactory masterSqlSessionFactory) { return new SqlSessionTemplate(masterSqlSessionFactory); } @Bean(name = "slaveSqlSessionTemplate") public SqlSessionTemplate slaveSqlSessionTemplate(SqlSessionFactory slaveSqlSessionFactory) { return new SqlSessionTemplate(slaveSqlSessionFactory); } } ``` 4. 在Mapper接口中使用`@Mapper`注解指定要使用的SqlSessionTemplate: ```java @Mapper public interface UserMapper { @Select("select * from user where id = #{id}") User selectById(@Param("id") Long id); } ``` ```java @Mapper public interface OrderMapper { @Select("select * from order where user_id = #{userId}") List<Order> selectByUserId(@Param("userId") Long userId); } ``` ```java @Service public class UserService { @Autowired @Qualifier("masterSqlSessionTemplate") private SqlSessionTemplate masterSqlSessionTemplate; @Autowired @Qualifier("slaveSqlSessionTemplate") private SqlSessionTemplate slaveSqlSessionTemplate; @Autowired private UserMapper userMapper; public User selectUserById(Long id) { return userMapper.selectById(id); } } ``` ```java @Service public class OrderService { @Autowired @Qualifier("slaveSqlSessionTemplate") private SqlSessionTemplate slaveSqlSessionTemplate; @Autowired private OrderMapper orderMapper; public List<Order> selectOrdersByUserId(Long userId) { return orderMapper.selectByUserId(userId); } } ``` 通过以上配置,就可以实现使用Druid连接池的MybatisPlus多数据源配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值