SpringBoot学习笔记25——Mybatis多数据源配置

       本来是半个月之前就要写这篇博客的,结果临时有事一下给忘记了,现在补上。由于时间比较长了,如果有哪些地方写的不清楚的,可以在评论指出,博主会第一时间来修改完善博客内容。

我今天记录的是在已经使用oracle数据库的情况下,添加mysql的数据源。话不多说直接上代码。

1.首先我们需要先写一下配置文件的内容,在数据源配置中,添加mysql的配置。

#Oracle数据库,这部分是原有配置
spring.datasource.url = jdbc:oracle:thin:@//localhost:9290/ADC
spring.datasource.username = 123
spring.datasource.password = 123

spring.datasource.type = com.alibaba.druid.pool.DruidDataSource

#Mysql数据库,这部分是添加的mysql的配置
spring.datasource.mysql.url = jdbc:mysql://localhost:3306/jhmon?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.mysql.username = root
spring.datasource.mysql.password = 123

spring.datasource.mysql.driver-class-name=com.mysql.jdbc.Driver

2.配置mysql数据源

oracle数据源配置不需要改动,为了方便大家还是贴出来吧

package com.adc.da.main.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

/**
 * Druid的DataResource配置类
 * 凡是被Spring管理的类,实现接口 EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,
 * 获取到系统环境变量和application配置文件中的变量。 还有一种方式是采用注解的方式获取 @value("${变量的key值}")
 */
@Configuration
@MapperScan(basePackages = "com.adc.da.**.dao", sqlSessionFactoryRef = "cagdsSqlSessionFactory")
public class DruidDataSourceConfig implements EnvironmentAware {

    @Value("${mybatis.mapper-locations}")
    private String mappingLocation;

    private RelaxedPropertyResolver propertyResolver;

    @Override
    public void setEnvironment(Environment env) {
        this.propertyResolver = new RelaxedPropertyResolver(env, "spring.datasource.");
    }

    @Bean(name = "oracleDataSource")
    @Primary
    public DataSource dataSource() {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(propertyResolver.getProperty("url"));
        datasource.setDriverClassName(propertyResolver.getProperty("driver-class-name"));
        datasource.setUsername(propertyResolver.getProperty("username"));
        datasource.setPassword(propertyResolver.getProperty("password"));
        datasource.setInitialSize(Integer.valueOf(propertyResolver.getProperty("initialSize")));
        datasource.setMinIdle(Integer.valueOf(propertyResolver.getProperty("minIdle")));
        datasource.setMaxWait(Long.valueOf(propertyResolver.getProperty("maxWait")));
        datasource.setMaxActive(Integer.valueOf(propertyResolver.getProperty("maxActive")));
        datasource.setMinEvictableIdleTimeMillis(
                Long.valueOf(propertyResolver.getProperty("minEvictableIdleTimeMillis")));
        try {
            datasource.setFilters("stat,wall");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return datasource;
    }

    @Bean
    public ServletRegistrationBean druidServlet() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
        servletRegistrationBean.setServlet(new StatViewServlet());
        servletRegistrationBean.addUrlMappings("/druid/*");
        Map<String, String> initParameters = new HashMap<String, String>();
        // initParameters.put("loginUsername", "druid");// 用户名
        // initParameters.put("loginPassword", "druid");// 密码
        initParameters.put("resetEnable", "false");// 禁用HTML页面上的“Reset All”功能
        initParameters.put("allow", "127.0.0.1"); // IP白名单 (没有配置或者为空,则允许所有访问)
        // initParameters.put("deny", "192.168.20.38");// IP黑名单
        // (存在共同时,deny优先于allow)
        servletRegistrationBean.setInitParameters(initParameters);
        return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }

    // 按照BeanId来拦截配置 用来bean的监控
    @Bean(value = "druid-stat-interceptor")
    public DruidStatInterceptor druidstatinterceptor() {
        return new DruidStatInterceptor();
    }

    @Bean
    public BeanNameAutoProxyCreator beanNameAutoProxyCreator() {
        BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();
        beanNameAutoProxyCreator.setProxyTargetClass(true);
        // 设置要监控的bean的id
        beanNameAutoProxyCreator.setInterceptorNames("druid-stat-interceptor");
        return beanNameAutoProxyCreator;
    }


    @Bean(name = "transactionManager")
    @Primary
    public DataSourceTransactionManager cagdsTransactionManager(
            @Qualifier("oracleDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "cagdsSqlSessionFactory")
    @Primary
    public SqlSessionFactory cagdsSqlSessionFactory(
            @Qualifier("oracleDataSource") DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(mappingLocation));
        return sessionFactory.getObject();
    }

    @Bean(name = "cagdsJdbcTemplate")
    @Primary
    public JdbcTemplate cagdsJdbcTemplate(@Qualifier("oracleDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}

下面是添加的mysql数据源的配置

package com.adc.da.main.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
import java.sql.SQLException;

/**
 * Druid的DataResource配置类
 * 凡是被Spring管理的类,实现接口 EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,
 * 获取到系统环境变量和application配置文件中的变量。 还有一种方式是采用注解的方式获取 @value("${变量的key值}")
 */
@Configuration
@MapperScan(basePackages = "com.adc.signal.dao", sqlSessionFactoryRef = "sessionFactoryMysql")
public class MybatisMysqlConfig implements EnvironmentAware {

    @Value("${mybatis.mapper-locations}")
    private String mappingLocation;

    @Value("${spring.datasource.mysql.url}")
    private String url;
    @Value("${spring.datasource.mysql.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.mysql.username}")
    private String username;
    @Value("${spring.datasource.mysql.password}")
    private String password;

    private RelaxedPropertyResolver propertyResolver;



    @Override
    public void setEnvironment(Environment env) {
        this.propertyResolver = new RelaxedPropertyResolver(env, "spring.datasource.");
    }

    @Bean(name = "dataSourceMysql")
    public DataSource dataSource() {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(url);
        datasource.setDriverClassName(driverClassName);
        datasource.setUsername(username);
        datasource.setPassword(password);


        datasource.setInitialSize(Integer.valueOf(propertyResolver.getProperty("initialSize")));
        datasource.setMinIdle(Integer.valueOf(propertyResolver.getProperty("minIdle")));
        datasource.setMaxWait(Long.valueOf(propertyResolver.getProperty("maxWait")));
        datasource.setMaxActive(Integer.valueOf(propertyResolver.getProperty("maxActive")));
        datasource.setMinEvictableIdleTimeMillis(
                Long.valueOf(propertyResolver.getProperty("minEvictableIdleTimeMillis")));
        try {
            datasource.setFilters("stat,wall");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return datasource;
    }

    @Bean(name = "transactionManagerMysql")
    public DataSourceTransactionManager cagdsTransactionManager(
            @Qualifier("dataSourceMysql") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "sessionFactoryMysql")
    public SqlSessionFactory sessionFactoryMysql(
            @Qualifier("dataSourceMysql") DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(mappingLocation));
        return sessionFactory.getObject();
    }

    @Bean(name = "jdbcTemplateMysql")
    public JdbcTemplate cagdsJdbcTemplate(@Qualifier("dataSourceMysql") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}

这块需要注意的一点是:类注解中的两个数据源配置的扫描的包名不能有冲突,如果两个包名之间又交集的话就会出现问题,博主在这里就被坑了一下。

@MapperScan(basePackages = "com.adc.da.**.dao", sqlSessionFactoryRef = "cagdsSqlSessionFactory")

@MapperScan(basePackages = "com.adc.signal.dao", sqlSessionFactoryRef = "sessionFactoryMysql")

 

3.最后一步需要去掉启动类中的相关数据源注解例如:@MapperScan注解

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中配置MyBatis多数据源可以通过以下步骤进行: 1. 添加相关依赖:导入MyBatis和数据库驱动的依赖,例如MySQL或者其他数据库的驱动。 2. 配置数据源:在`application.properties`或`application.yml`中配置多个数据源的连接信息,例如: ```yaml spring: datasource: primary: url: jdbc:mysql://localhost:3306/primary_db username: primary_user password: primary_password secondary: url: jdbc:mysql://localhost:3306/secondary_db username: secondary_user password: secondary_password ``` 这里配置了两个数据源,一个是主数据源(primary),另一个是次要数据源(secondary)。 3. 配置数据源 Bean:创建多个数据源的`DataSource`对象,并将其注册为Spring Bean。可以使用`@Configuration`注解的类来完成这个配置,例如: ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } } ``` 这里通过`@ConfigurationProperties`注解将数据源配置信息绑定到对应的`DataSource`对象。 4. 配置MyBatis SqlSessionFactory:创建多个SqlSessionFactory对象,分别关联不同的数据源。可以使用`@MapperScan`注解扫描MyBatis的Mapper接口,并指定对应的SqlSessionFactory对象,例如: ```java @Configuration @MapperScan(basePackages = "com.example.primary", sqlSessionFactoryRef = "primarySqlSessionFactory") public class MyBatisConfigPrimary { @Bean public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource primaryDataSource) throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(primaryDataSource); return sessionFactoryBean.getObject(); } } @Configuration @MapperScan(basePackages = "com.example.secondary", sqlSessionFactoryRef = "secondarySqlSessionFactory") public class MyBatisConfigSecondary { @Bean public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(secondaryDataSource); return sessionFactoryBean.getObject(); } } ``` 这里通过`@MapperScan`注解指定了不同包下的Mapper接口,并关联了对应的SqlSessionFactory对象。 5. 配置事务管理器(可选):如果需要使用事务管理,可以配置多个事务管理器,并指定对应的数据源。例如: ```java @Configuration @EnableTransactionManagement public class TransactionConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Autowired @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; @Bean public DataSourceTransactionManager primaryTransactionManager() { return new DataSourceTransactionManager(primaryDataSource); } @Bean public DataSourceTransactionManager secondaryTransactionManager() { return new DataSourceTransactionManager(secondaryDataSource); } } ``` 这里通过`@EnableTransactionManagement`启用事务管理,同时配置了对应的数据源的事务管理器。 通过以上配置,即可实现MyBatis多数据源配置。注意,在编Mapper接口时,需要通过`@Qualifier`注解指定使用哪个数据源。例如: ```java @Qualifier("primarySqlSessionFactory") @Repository public interface PrimaryMapper { // ... } @Qualifier("secondarySqlSessionFactory") @Repository public interface SecondaryMapper { // ... } ``` 这样就可以在不同的Mapper接口中使用不同的数据源了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值