1、首先,application.properties中配置两个数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.3.144:3306/demo?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.db2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.db2.url=jdbc:mysql://192.168.3.144:3306/alienvault?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
spring.datasource.db2.username=root
spring.datasource.db2.password=123456
2、导入MySQL的驱动包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
3、项目的目录结构
右图中可以看到数据源对应的dao层是在两个不同的目录下,分别为dao 和 dao2
4、编写两个数据源的配置类
第一个:
package com.qzt.config.mybatis;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* Created by lijj on 6/1/17.
*/
@Configuration
@MapperScan(basePackages = "com.qzt.model.dao", sqlSessionTemplateRef = "sqlSessionTemplate")
public class MybatisConfiguration {
@Primary
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource getDataSource() throws SQLException {
return new DruidDataSource();
}
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory getSqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception{
SqlSessionFactoryBean sqlfb = new SqlSessionFactoryBean();
sqlfb.setDataSource(dataSource);
sqlfb.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
sqlfb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:sqlmap/*.xml"));
return sqlfb.getObject();
}
@Bean(name = "transactionManager")
public DataSourceTransactionManager getTransactionManager(@Qualifier("dataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sqlSessionTemplate")
public SqlSessionTemplate getSqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
第二个:
package com.qzt.config.mybatis;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* Created by lijj on 6/1/17.
*/
@Configuration
@MapperScan(basePackages = "com.qzt.model.dao2", sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MybatisConfiguration2 {
@Bean(name = "dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource getDataSource() throws SQLException {
return new DruidDataSource();
}
@Bean(name = "sqlSessionFactory2")
@Primary
public SqlSessionFactory getSqlSessionFactory(@Qualifier("dataSource2") DataSource dataSource) throws Exception{
SqlSessionFactoryBean sqlfb = new SqlSessionFactoryBean();
sqlfb.setDataSource(dataSource);
sqlfb.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
sqlfb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:sqlmap/*.xml"));
return sqlfb.getObject();
}
@Bean(name = "transactionManager2")
@Primary
public DataSourceTransactionManager getTransactionManager(@Qualifier("dataSource2")DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sqlSessionTemplate2")
@Primary
public SqlSessionTemplate getSqlSessionTemplate(@Qualifier("sqlSessionFactory2")SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
5、这里还需要启动类中加入一个注解(这个好像是必须的,经过测试如果没有的话会报错)
@MapperScan(basePackages = {"com.qzt.model"})
6、使用
package com.qzt.model.dao.common;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.Resource;
public class BaseDAO {
@Autowired
@Resource(name = "sqlSessionTemplate")
protected SqlSessionTemplate sqlSessionTemplate;
@Autowired
@Resource(name = "sqlSessionTemplate2")
protected SqlSessionTemplate sqlSessionTemplate2;
}
这里通过继承BaseDao来实现双数据源
package com.qzt.model.dao2.dashboards.executive;
import com.qzt.model.dao.common.BaseDAO;
import com.qzt.model.entity.SecurityEventsTop5;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Data
@Component
@Slf4j
public class SecurityEventsTop5Dao extends BaseDAO {
public List<SecurityEventsTop5> getSecurityEventsTop5(){
List<SecurityEventsTop5> list = new ArrayList<SecurityEventsTop5>();
try {
list = sqlSessionTemplate2.selectList("Executive.getSecurityEventsTop5");
} catch (Exception e) {
log.error("error",e);
}
return list;
}
}
注意:双数据源里两个数据源可以把.xml文件放置在同一个目录下,像我得这个都放到了resources下的sqlmap目录下。