本來是半個月之前就要寫這篇博客的,結果臨時有事一下給忘記了,現在補上。由於時間比較長了,如果有哪些地方寫的不清楚的,可以在評論指出,博主會第一時間來修改完善博客內容。
我今天記錄的是在已經使用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註解