Mybatis配置多数据源(Oracle+mysql*2)

引言

废话不多,直接开造

一.配置文件配置

1.数据库连接配置:

#db
spring.datasource.one.jdbc-url = jdbc:oracle:thin:@172.168.134.55:2222/oracletest
spring.datasource.one.username = root
spring.datasource.one.password = root
spring.datasource.one.driverClassName = oracle.jdbc.driver.OracleDriver

spring.datasource.two.jdbc-url = jdbc:mysql://172.168.134.56:2223/mysqltest1?socketTimeout=60000&connectTimeout=30000&useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.two.username = root
spring.datasource.two.password = root 
spring.datasource.two.driverClassName = com.mysql.jdbc.Driver

spring.datasource.three.jdbc-url = jdbc:mysql://172.168.134.57:2224/mysqltest2?socketTimeout=60000&connectTimeout=30000&useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.three.username = root
spring.datasource.three.password = root
spring.datasource.three.driverClassName = com.mysql.jdbc.Driver

2.PageHelper分页插件配置

#pagehelper.helperDialect = oracle #不要指定分页数据库类型
pagehelper.reasonable = false 
pagehelper.supportMethodsArguments = true #默认为 false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,自动分页
pagehelper.params = count=countSql
pagehelper.auto-dialect = true #自动选择数据库类型
pagehelper.auto-runtime-dialect = true #运行时选择分页语句

二.Application去除自动配置数据源与mybatis自动配置

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class})

三.Configuration类

有多少个数据源就配置多少个config

one

@Configuration
@MapperScan(basePackages = "cn.com.report.dao.one",sqlSessionTemplateRef = "oneSqlSessionTemplate")
public class OneMyBatisConfig {

	//xml文件地址
    static final String MAPPER_LOCATION = "classpath:mybatis/one/*.xml";

    @Bean(name = "oneDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.one")//配置前缀
    @Primary //主数据源,其他几个不用这个注解
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "oneSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("oneDataSource")DataSource oneDataSource) throws Exception {

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(oneDataSource);

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

        sqlSessionFactoryBean.setMapperLocations(resolver.getResources(MAPPER_LOCATION));
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        sqlSessionFactoryBean.setConfiguration(configuration);
        return sqlSessionFactoryBean.getObject();
    }


    @Bean(name = "oneTransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }


    @Bean(name = "oneSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("oneSqlSessionFactory")SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); }

}

two

@Configuration
@MapperScan(basePackages = "cn.com.report.dao.two",sqlSessionTemplateRef = "twoSqlSessionTemplate")
public class TwoMyBatisConfig {

	//xml文件地址
    static final String MAPPER_LOCATION = "classpath:mybatis/two/*.xml";

    @Bean(name = "twoDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.two")//配置前缀
    @Primary
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "twoSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("twoDataSource")DataSource twoDataSource) throws Exception {

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(twoDataSource);

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

        sqlSessionFactoryBean.setMapperLocations(resolver.getResources(MAPPER_LOCATION));
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        sqlSessionFactoryBean.setConfiguration(configuration);
        return sqlSessionFactoryBean.getObject();
    }


    @Bean(name = "twoTransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }


    @Bean(name = "twoSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("twoSqlSessionFactory")SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); }

}

three

@Configuration
@MapperScan(basePackages = "cn.com.report.dao.three",sqlSessionTemplateRef = "threeSqlSessionTemplate")
public class ThreeMyBatisConfig {

	//xml文件地址
    static final String MAPPER_LOCATION = "classpath:mybatis/three/*.xml";

    @Bean(name = "threeDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.three")//配置前缀
    @Primary
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "threeSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("threeDataSource")DataSource threeDataSource) throws Exception {

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(threeDataSource);

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

        sqlSessionFactoryBean.setMapperLocations(resolver.getResources(MAPPER_LOCATION));
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        sqlSessionFactoryBean.setConfiguration(configuration);
        return sqlSessionFactoryBean.getObject();
    }


    @Bean(name = "threeTransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }


    @Bean(name = "threeSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("threeSqlSessionFactory")SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); }

}

注意xml文件与dao文件地址与目录结构
完成!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你的问题是关于如何在Spring Boot应用中实现多数据动态切换,使用的技术包括Spring Boot、MyBatisMySQLOracle、Druid数据连接池、自定义注解和切面,并且配置文件使用application.yml格式。 首先,需要在pom.xml文件中添加相应的依赖: ```xml <!--Spring Boot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!--MyBatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <!--MySQL--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> <!--Oracle--> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> </dependency> <!--Druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> ``` 接下来,需要在application.yml文件中配置数据MyBatis相关的属性,例如: ```yaml spring: datasource: druid: # 数据1 db1: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root # 数据2 db2: driver-class-name: oracle.jdbc.OracleDriver url: jdbc:oracle:thin:@localhost:1521:ORCL username: scott password: tiger # 默认数据 url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.demo.entity ``` 然后,需要定义一个自定义注解,用于标识哪些方法需要使用哪个数据: ```java @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DataSource { String value() default "db1"; } ``` 在数据切换的时候,我们需要获取注解上指定的数据名称,因此需要定义一个切面: ```java @Aspect @Component public class DataSourceAspect { @Around("@annotation(ds)") public Object around(ProceedingJoinPoint point, DataSource ds) throws Throwable { String dataSourceName = ds.value(); DynamicDataSource.setDataSource(dataSourceName); try { return point.proceed(); } finally { DynamicDataSource.clearDataSource(); } } } ``` 最后,需要定义一个动态数据,用于实现数据的切换: ```java public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> dataSourceHolder = new ThreadLocal<>(); @Override protected Object determineCurrentLookupKey() { return dataSourceHolder.get(); } public static void setDataSource(String dataSourceName) { dataSourceHolder.set(dataSourceName); } public static void clearDataSource() { dataSourceHolder.remove(); } } ``` 至此,多数据动态切换的配置就完成了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值