mybatis plus多数据源实现

新手现学mybatis plus多数据源,网上查了很多多数据源实现的文章都不能实现,不是知道是不正确还是什么原因。要不是报错就是代码执行了没结果。下面是我自己的环境下实现的方法

环境要求:JDK17、spring-boot 3.2.4、mybatis-plus3.5.5

pom配置如下:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.5</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.14</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.20</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.20</version>
        </dependency>
        <!--lombok用来简化实体类:需要安装lombok插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--for SqlServer-->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <!-- 根据 JDK 版本选择合适的依赖 -->
            <version>12.8.1.jre11</version>
        </dependency>
    </dependencies>

上面mybatis-spring3.0.3和mybatis3.5.14显示引入,mybatis-plus用的是mybatis-plus-spring-boot3-starter标识,用mybatis-plus-boot-starter应该也行但是我第一次试的时候不行,后面改成mybatis-plus-spring-boot3-starter就没问题了,再改回来也行了。安全起见还是用mybatis-plus-spring-boot3-starter吧

yml配置:

spring:
  datasource:
    db1: # 自定义名称
      jdbc-url: jdbc:sqlserver://127.0.0.1:1433;databaseName=Database1;encrypt=false;
      username: username
      password: password
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    db2: # 自定义名称
      jdbc-url: jdbc:sqlserver://127.0.0.1;databaseName=Database2;encrypt=false;
      username: username
      password: password
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
#      type: com.alibaba.druid.pool.DruidDataSource
  application:
    name: dam_auth
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml  # Mapper XML 文件路径
  type-aliases-package: com.*.*.Entity   # 实体类包路径
  configuration:
    map-underscore-to-camel-case: false #驼峰转换

上面配置中这个版本的mybatis plus配置jdbc要用jdbc-url才行,否则查出报错,127.0.0.1IP是你自己数据库的IP地址或者链接,然后mybatis-plus:中type-aliases-package:配置成你自己的实体包就行了,

建立数据配置文件类:

public class DataSourceConfig {

    @Bean (name = "db1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public DataSource db1DataSource() {
        DataSource dataSource = DataSourceBuilder.create().build();
        return dataSource;
    }

    @Bean (name = "db2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource db2DataSource() {
        DataSource dataSource = DataSourceBuilder.create().build();
        return dataSource;
    }

    @Bean(name = "dynamicDataSource")
    @Primary
    public DataSource routingDataSource(@Qualifier("db1DataSource") DataSource db1DataSource,
                                        @Qualifier("db2DataSource") DataSource db2DataSource) {
        AbstractRoutingDataSource routingDataSource = new DynamicDataSource();
        // 设置默认数据源
        routingDataSource.setDefaultTargetDataSource(db1DataSource);
        // 设置所有数据源
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DataSourceConstants.db1, db1DataSource);
        targetDataSources.put(DataSourceConstants.db2, db2DataSource);
        routingDataSource.setDefaultTargetDataSource(db1DataSource);
        routingDataSource.setTargetDataSources(targetDataSources);
        routingDataSource.afterPropertiesSet();
        return routingDataSource;
    }
}

上面类中Primary的设置是必须的,否者或报发现了多个数据源的错。prefix的路径必须对准。

数据源标识类:

public class DataSourceConstants {
    public static final String db1 = "db1";
    public static final String db2 = "db2";
}

关键是MyBatis配置类需要,网上很都都没有这个,我不知道是不是我没理解透彻,没有这个是不能识别和加载数据源类如下:

@Configuration
@MapperScan(basePackages = "com.*.*.mapper", sqlSessionFactoryRef = "sqlSessionFactory")
public class MyBatisConfig {
    @Bean
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath*:/mapper/*.xml"));//"classpath*:mapper/*.xml"
        return sessionFactory.getObject();
    }
}

其中basePackages = "com.*.*.mapper设置你自己的mapper路径

Mapper接口:

@Mapper
@Repository
public interface  BasinMapper extends BaseMapper<Basin> {

}

实体类:

@Data
@TableName("Basin")
public class Basin {
    private BigInteger ID;
    @TableField(value = "BasinName")
    private String BasinName;
}

接下来两个数据源切换的类很重要

DataSourceContextHolder类如下:

package com.scu.damSS.Configuration;
public final class DataSourceContextHolder {
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    public static void setDataSourceKey(String key) {
        contextHolder.set(key);
    }

    public static String getDataSourceKey() {
        return contextHolder.get();
    }

    public static void clearDataSourceKey() {
        contextHolder.remove();
    }
}

DynamicDataSource类如下:这个类是数据切换功能

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        String dataSourceKey = DataSourceContextHolder.getDataSourceKey();        return dataSourceKey;
    }
}

这样我们能够使用了:

@Controller
public class TestController {
    @Autowired
    private BasinMapper basinMapper;
    @RequestMapping("getAllbasin")
    @ResponseBody//把返回值打印到页面(JSON)
    public Object getAllbasin() {
        DataSourceContextHolder.setDataSourceKey(DataSourceConstants.db1);
        QueryWrapper<Basin> queryWrapper=new QueryWrapper<>();
        queryWrapper.orderByDesc("ID");
        Object basins =basinMapper.selectList(null); // 使用主数据源
        DataSourceContextHolder.clearDataSourceKey();
        return  basins;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值