SpringBoot+MybatisPlus+jdbc连接池配置多数据源的实现
目录
- 上pom.XML文件
- 目录结构
- application.xml的结构
- 重要组成部分
- 1.数据源注解以及aop配置
- myBATisplus动态数据源的配置
- 测试是否成功
- 测试结果
上pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>spring-dataSource</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-dataSource</name> <description>Demo project for Spring Boot</description> <properties> 编程客栈 <Java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR5</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.1.8</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifact编程Id>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>junit</groupId> python <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
目录结构
application.xml的结构
server: port: 9086 spring: datasource: #database primary: # 3.0 Datasource jdbc-url: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&auphptoReconnect=true&zeroDateTimeBehavior=convertToNull username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver secondary: # 2.0 Datasource jdbc-url: jdbc:mysql://localhost:3306/user02?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&autoReconnect=true&zeroDateTimeBehavior=convertToNull username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver application: name: lixiaolong #mybatis mybatis-plus: mapper-locations: classpath:/mapper/*Mapper.xml #实体扫描,多个package用逗号或者分号分隔 typeAliasesPackage: com.example.demo.entity; global-config: #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; id-type: 0 #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" field-strategy: 2 #驼峰下划线转换 db-column-underline: true #刷新mapper 调试神器 refresh-mapper: true #数据库大写下划线转换 #capital-mode: true logic-delete-value: -1 logic-not-delete-value: 0 configuration: map-underscore-to-camel-case: true cache-enabled: false call-setters-on-nulls: true
重要组成部分
1.数据源注解以及aop配置
一.
@Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DataSource { DataSourceEnum value() default DataSourceEnum.DB1; }
二.
@Component @Slf4j @ASPect @Order(-1) public class DataSourceAspect { @Pointcut("@within(com.example.demo.annotation.DataSource) || @annotation(com.example.demo.annotation.DataSource)") public void pointCut(){ } @Before("pointCut() && @annotation(dataSource)") public void doBefore(DataSource dataSource){ // log.info("选择数据源---"+dataSource.value().getValue()); DataSourceContextHolder.setDataSource(dataSource.value().getValue()); } @After("pointCut()") public void doAfter(){ DataSourceContextHolder.clear(); } }
mybatisplus动态数据源的配置
一.mybatisplus动态数据源配置类
@Configuration // 注解到spring容器中 @MapperScan(basePackages = "com.example.demo.mapper*") public class MybatisDataSource { /* * 分页插件,自动识别数据库类型 多租户,请参考官网【插件扩展】 */ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // 开启 PageHelper 的支持 paginationInterceptor.setLocalPage(true); return paginationInterceptor; } /** * SQL执行效率插件 */ @Bean @Profile({ "dev", "qa" }) // 设置 dev test 环境开启 public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); performanceInterceptor.setMaxTime(1000); performanceInterceptor.setFormat(true); return performanceInterceptor; } /** * 返回data1数据库的数据源 * * @return */ @Bean(name = "primary") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primary() { return DataSourceBuilder.create().build(); } @Bean(name = "secondary") // @Primary//主数据源 @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondary() { return DataSourceBuilder.create().build(); } @Bean("sqlSessionFactory") public SqlSessionFactory sqlSessionFactory编程客栈() throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(); sqlSessionFactory.setDataSource(multipleDataSource(primary(), secondary())); // sqlSessionFactory.setMapperlocations(new // PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*/*Mapper.xml")); MybatisConfiguration configuration = new MybatisConfiguration(); // configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class); configuration.setJdbcTypeForNull(JdbcType.NULL); configuration.setMapUnderscoreToCamelCase(true); configuration.setCacheEnabled(false); sqlSessionFactory.setConfiguration(configuration); sqlSessionFactory.setPlugins(new Interceptor[] { // PerformanceInterceptor(),OptimisticLockerInterceptor() paginationInterceptor() // 添加分页功能 }); // sqlSessionFactory.setGlobalConfig(globalConfiguration()); return sqlSessionFactory.getObject(); } /** * 动态数据源配置 * * @return */ @Bean @Primary public DataSource multipleDataSource(@Qualifier("primary") DataSource db1, @Qualifier("secondary") DataSource DB2) { MultipleDataSource multipleDataSource = new MultipleDataSource(); Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceEnum.DB1.getValue(), db1); targetDataSources.put(DataSourceEnum.DB2.getValue(), db2); // 添加数据源 multipleDataSource.setTargetDataSources(targetDataSources); // 设置默认数据源 multipleDataSource.setDefaultTargetDataSource(db1); return multipleDataSource; } }
二.配置其他
public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new InheritableThreadLocal<>(); /** * 设置数据源 * @param db */ public static void setDataSource(String db){ contextHolder.set(db); } /** * 取得当前数据源 * @return */ public static String getDataSource(){ return contextHolder.get(); } /** * 清除上下文数据 */ public static void clear(){ contextHolder.remove(); } }
三.
public class MultipleDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { // TODO Auto-generated method stub return DataSourceContextHolder.getDataSource(); } }
测试是否成功
@RunWith(SpringRunner.class) @SpringBootTest @ActiveProfiles("dev") public class SpringDataSourceApplicationTests { @Autowired private UserMapper userService; @Autowired private User02Service user02Service; @Test public void contextLoads() { User user = userService.selectById(1); User02 user02 = new User02(); BeanUtils.copyProperties(user, user02); user02Service.insert(user02); System.out.printf("数据是:"); } }
测试结果
到此这篇关于SpringBoot+MybatisPlus+jdbc连接池配置多数据源的实现的文章就介绍到这了,更多相关SpringBoot MybatisPlus jdbc多数据源内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论