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註解

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章