1、修改应用的入口
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class QuestionbanksystemApplication {
public static void main(String[] args) {
SpringApplication.run(QuestionbanksystemApplication.class, args);
}
}
这是因为 SpringBoot 会自动根据依赖来自动配置,但是我们的数据源配置被我们自己自定义配置了,此时 SpringBoot 无法完成自动化配置,因此就会报错,所以此处我们需要排除 DataSourceAutoConfiguration
的自动配置.
2、配置数据源
这里我们配置来两个数据源 一个是 first,一个 second,修改 application.yml
文件
spring:
datasource:
#druid相关配置
druid:
first:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://aaa:3306/aaa?useUnicode=true&characterEncoding=UTF-8
username: root
password: xxx
second:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://bbb:3306/bbb?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai
username: root
password: xxx
3、完成数据源配置
这里需要完成 DataSource/SqlSessionFactory/SessionTemp 等对象的注入,需要注意的是,不管配置多少个数据源,其中的一个数据源配置的 Bean 必须使用 @Primary
完成注解.
下面是两个数据源的配置,其中 First 使用了 @Primary 注解
MapperScan 注解的 basePackages 表示了其目录下的 Mapper 使用文件使用该数据源,如 FirstDataSource 中表示
"com.questionbanksystem.dao.test1
下的 Maper 文件将使用 FirstDataSource.
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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.questionbanksystem.dao.test1",sqlSessionTemplateRef ="firstSqlSessionTemplate")
public class FirstDataSourceConfig {
// 创建数据源
@Bean(name = "firstDS")
//这里就是application.yml中配置的路径
@ConfigurationProperties(prefix = "spring.datasource.druid.first")
@Primary
public DataSource getFirstDataSource() {
DataSource build = DataSourceBuilder.create()
.driverClassName("com.mysql.jdbc.Driver")
.url("jdbc:mysql://aaa:3306/aaa?useUnicode=true&characterEncoding=UTF-8")
.username("root")
.password("xxx")
.build();
return build;
}
// 创建SessionFactory
@Bean(name = "firstSqlSessionFactory")
@Primary
public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDS") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//下面是配置mybatis驼峰命名规则自动转换
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session
.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
bean.setConfiguration(configuration);
return bean.getObject();
}
// 创建事务管理器
@Bean("firstTransactionManger")
@Primary
public DataSourceTransactionManager firstTransactionManger(@Qualifier("firstDS") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
// 创建SqlSessionTemplate
@Bean(name = "firstSqlSessionTemplate")
@Primary
public SqlSessionTemplate firstSqlSessionTemplate(@Qualifier("firstSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
private Class getType(String type) {
try {
return Class.forName(type);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
以及第二个数据源的配置
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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.questionbanksystem.dao.test2",sqlSessionTemplateRef ="secondSqlSessionTemplate")
public class SecondDataSourceConfig {
// 创建数据源
@Bean(name = "secondDS")
//这里就是application.yml中配置的路径
@ConfigurationProperties(prefix = "spring.datasource.druid.second")
public DataSource getSecondDataSource() {
DataSource build = DataSourceBuilder.create()
.driverClassName("com.mysql.jdbc.Driver")
.url("jdbc:mysql://bbb:3306/bbb?useUnicode=true&characterEncoding=UTF8&useSSL=false")
.username("root")
.password("xxx")
.build();
return build;
}
// 创建SessionFactory
@Bean(name = "secondSqlSessionFactory")
public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDS") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//下面是配置mybatis驼峰命名规则自动转换
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session
.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
bean.setConfiguration(configuration);
return bean.getObject();
}
// 创建事务管理器
@Bean("secondTransactionManger")
public DataSourceTransactionManager secondTransactionManger(@Qualifier("secondDS") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
// 创建SqlSessionTemplate
@Bean(name = "secondSqlSessionTemplate")
public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
private Class getType(String type) {
try {
return Class.forName(type);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
4、实现 Mapper
根据数据源配置的 MappScan 目录中的 basePackages 来创建 Mapper,注意包名,放在正确的位置上.
5、总结
其余的操作和单数据源时没有区别。重点:
- mapper 文件的地址,一定和数据源配置中 MappScan 目录中的 basePackages 一致。
- 驼峰式命名的转换。之前的配置是在
application.yml
中mybatis: configuration: map-underscore-to-camel-case: true
可是后来发现配置双数据源之后失效了,所以需要在两个数据源配置文件里都重新配置。
@Bean(name = "firstSqlSessionFactory") @Primary public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDS") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //下面是配置mybatis驼峰命名规则自动转换------ org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session .Configuration(); configuration.setMapUnderscoreToCamelCase(true); bean.setConfiguration(configuration); //----------------------------------------- return bean.getObject(); }
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于