新手现学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; }