SpringBoot+MybatisPlus+jdbc连接池配置多数据源

上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>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <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&autoReconnect=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("数据是:");
	    }

	

}

测试结果

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值