mybatis-plus双数据源@DS踩坑

mybatis-plus中使用的dynamic-datasource-spring-boot-starter 里的 @DS 功能.

业务需要切换数据源,后台配置双数据源用于处理kafka生产者发送过来的实时数据,kafka消费者后台配置主从库双数据源。
难受的是主从库,库名表名列个数均不同,一开始就报找不到某列,Unknown Column ‘xxx’,找了半天发现,debug进入业务发现使用的一直是主库,从主库查询到的数据实体当然封装不到从库的数据实体,所以就报某字段未定义找不到未知这样的错。
阐述下我犯的错。就是因为在业务实现类上开启了事务,我个憨憨

整理@DS的用法:@DS可以注解在方法上、类上、接口、枚举,同时存在方法注解优先于类上注解。

常见问题:涉及需要切换数据源时,

  1.不能使用事务,否则数据源不会切换,使用的还是是第一次加载的数据源 。

删除 操作多数据源的方法或者类、接口 上的 注解 @Transactional() 即可。

  2.第一次加载的数据源之后,第二次(第三次...)操作其它数据源,如果数据源不存在,使用的还是第一次加载的数据源

  3.数据源名称最好不要包含下滑线,下滑线的数据源切换不了
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: Mybatis-plus 可以通过在配置文件中配置多个数据源来实现多数据源的支持。 1. 在 application.yml 或者 application.properties 中配置多个数据源,如: ``` spring: datasource: master: url: jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver slave: url: jdbc:mysql://localhost:3306/slave?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver ``` 2. 在 mybatis-plus 的配置类中,通过注解 @ConfigurationProperties(prefix = "spring.datasource.master") 来指定使用哪个数据源。 3. 在 Service 中通过注解 @DS("slave") 来指定使用从库, @DS("master") 来指定使用主库。 参考代码: ``` @Configuration @MapperScan(basePackages = "com.example.mapper", sqlSessionTemplateRef = "slaveSqlSessionTemplate") @ConfigurationProperties(prefix = "spring.datasource.slave") public class SlaveDataSourceConfig { @Bean(name = "slaveDataSource") public DataSource dataSource() { return new DruidDataSource(); } @Bean(name = "slaveSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } @Bean(name = "slaveSqlSessionTemplate") public SqlSessionTemplate sqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } } @Service @DS("slave") public class TestService { @Autowired private TestMapper testMapper; public List<Test> getAll() { return testMapper.selectList(null); } } ``` 需要注意的是,使用多数据源需要在项目中引入 mybatis-plus-extension 包,并且需要配置多数据源的事务管理器。 ### 回答2: Mybatis-plus是一个流行的Mybatis增强工具包,允许开发人员更容易地与数据库进行交互。在实际开发中,我们可能需要使用多个数据源来达到不同的业务需求。下面是配置Mybatis-plus数据源的详细步骤。 1. 添加多数据源配置项 在application.yml中添加多个数据源配置,例如: ```yaml # 主数据源配置 spring.datasource.master.url=jdbc:mysql://localhost:3306/master spring.datasource.master.username=root spring.datasource.master.password=root # 从数据源配置 spring.datasource.slave.url=jdbc:mysql://localhost:3306/slave spring.datasource.slave.username=root spring.datasource.slave.password=root ``` 2. 创建数据源对象 Mybatis-plus需要使用DruidDataSource数据源对象,因此需要创建多个数据源对象用于连接主从数据库。我们可以使用@Primary注解指定默认的数据源。 ```java @Configuration public class DataSourceConfig { @Primary @Bean @ConfigurationProperties("spring.datasource.master") public DataSource masterDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties("spring.datasource.slave") public DataSource slaveDataSource() { return DruidDataSourceBuilder.create().build(); } } ``` 3. 配置Mybatis-plus的SqlSessionFactory和SqlSessionTemplate 我们需要为每个数据源创建SqlSessionFactory和SqlSessionTemplate。Mybatis-plus提供了MybatisSqlSessionFactoryBean和MybatisSqlSessionTemplate两个类,用于创建Mybatis的SqlSessionFactory和SqlSessionTemplate对象。 ```java @Configuration @MapperScan(basePackages = {"com.example.mapper"}) public class MybatisConfig { @Primary @Bean public MybatisSqlSessionFactoryBean masterSqlSessionFactory( @Qualifier("masterDataSource") DataSource dataSource ) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); return factoryBean; } @Bean public MybatisSqlSessionTemplate masterSqlSessionTemplate( @Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory ) { return new MybatisSqlSessionTemplate(sqlSessionFactory); } @Bean public MybatisSqlSessionFactoryBean slaveSqlSessionFactory( @Qualifier("slaveDataSource") DataSource dataSource ) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); return factoryBean; } @Bean public MybatisSqlSessionTemplate slaveSqlSessionTemplate( @Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory ) { return new MybatisSqlSessionTemplate(sqlSessionFactory); } } ``` 4. 创建多数据源的Mapper接口 我们需要为每个数据源创建一个Mapper接口,用于访问相应的数据库。可以使用@Mapper注解将Mapper接口注册到Spring容器中。同时,我们需要使用@Qualifier注解指定具体的SqlSessionTemplate来操作不同的数据库。 ```java @Mapper @Component public interface MasterMapper { @Select("SELECT count(*) FROM user") int countUser(); } @Mapper @Component public interface SlaveMapper { @Select("SELECT count(*) FROM book") int countBook(); } ``` 5. 测试使用多数据源 我们可以在业务代码中使用注入的Mapper来操作主从数据库,例如: ```java @Service public class TestService { @Autowired @Qualifier("masterSqlSessionTemplate") private SqlSessionTemplate masterSqlSessionTemplate; @Autowired @Qualifier("slaveSqlSessionTemplate") private SqlSessionTemplate slaveSqlSessionTemplate; public int countUser() { return masterSqlSessionTemplate.getMapper(MasterMapper.class).countUser(); } public int countBook() { return slaveSqlSessionTemplate.getMapper(SlaveMapper.class).countBook(); } } ``` 通过以上步骤,我们成功地配置了Mybatis-plus的多数据源。在实际开发中,如果需要使用更多的数据源,只需按照以上方法添加即可。 ### 回答3: Mybatis-plus是一个基于Mybatis的一款全面功能和增强功能的ORM框架,它可以简化Java开发人员在不同的数据库之间切换的过程。在Mybatis-plus中,我们可以很容易的配置多数据源,以满足应用中不同业务所需的数据源。 下面,我们来详细了解Mybatis-plus配置多数据源的步骤: 1. 导入依赖 在pom.xml文件中导入Mybatis-plus和对应的数据库驱动依赖,如下所示: ```xml <!-- Mybatis-plus依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus-version}</version> </dependency> <!-- MySQL驱动依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 2. 配置数据源 在application.properties文件中配置数据源,如下所示: ```properties ## 主数据源 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/db1 spring.datasource.username=root spring.datasource.password=123456 ## 次数据源 spring.second.datasource.driver-class-name=com.mysql.jdbc.Driver spring.second.datasource.url=jdbc:mysql://localhost:3306/db2 spring.second.datasource.username=root spring.second.datasource.password=123456 ``` 3. 配置多数据源Mybatis-plus的配置文件中,我们通过定义多个数据源配置来实现多数据源的功能,如下所示: ```java @Configuration @MapperScan(basePackages = {"com.example.mapper1", "com.example.mapper2"}, sqlSessionTemplateRef = "sqlSessionTemplate") public class MybatisPlusConfig { @Bean(name = "dataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondDataSource") @ConfigurationProperties(prefix = "spring.second.datasource") public DataSource secondDataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/**/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name = "secondSqlSessionFactory") public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/**/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name = "transactionManager") public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "secondTransactionManager") public DataSourceTransactionManager secondTransactionManager(@Qualifier("secondDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "sqlSessionTemplate") public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } @Bean(name = "secondSqlSessionTemplate") public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } } ``` 在上述代码中,我们定义了两个数据源dataSource和secondDataSource,并分别配置了两个SqlSessionFactory、两个DataSourceTransactionManager以及两个SqlSessionTemplate。通过这种方式,就可以在应用中轻松切换不同的数据源,以满足应用中不同业务的需求。 总之,Mybatis-plus提供了非常简单的方式来配置多数据源,具体实现过程如上所示。对于开发者来说,如果要实现多数据源的切换,除了了解上述配置方式之外,还需要记住在使用时如何切换数据源,一定要注意正确使用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

慕木兮人可

感谢支持,勿忘初心

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

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

打赏作者

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

抵扣说明:

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

余额充值