版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013628152/article/details/82742356
一:多数据源配置
1、主数据源配置文件
package com.bert.datasource;
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.autoconfigure.jdbc.DataSourceBuilder;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.github.pagehelper.PageInterceptor;
import java.util.Properties;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.bert.mapper.master1", sqlSessionTemplateRef = "master1SqlSessionTemplate")
public class DataSource1Config {
@Bean(name = "master1DataSource")
@ConfigurationProperties(prefix = "master1.datasource")
@Primary
public DataSource master1DataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "master1SqlSessionFactory")
@Primary
public SqlSessionFactory master1SqlSessionFactory(@Qualifier("master1DataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master1/*.xml"));
// 分页拦截器-begin
PageInterceptor pageHelper = new PageInterceptor();
Properties properties = new Properties();
properties.setProperty("helperDialect", "com.github.pagehelper.dialect.helper.SqlServerDialect");
properties.setProperty("offsetAsPageNum", "true");
properties.setProperty("rowBoundsWithCount", "false");
properties.setProperty("reasonable", "false");
pageHelper.setProperties(properties);
bean.getObject().getConfiguration().addInterceptor(pageHelper);
return bean.getObject();
}
@Bean(name = "master1TransactionManager")
@Primary
public DataSourceTransactionManager master1TransactionManager(@Qualifier("master1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "master1SqlSessionTemplate")
@Primary
public SqlSessionTemplate master1SqlSessionTemplate(
@Qualifier("master1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
2、其他数据源配置文件
package com.bert.datasource;
import java.util.Properties;
import javax.sql.DataSource;
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.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.github.pagehelper.PageInterceptor;
@Configuration
@MapperScan(basePackages = "com.bert.mapper.master2", sqlSessionTemplateRef = "master2SqlSessionTemplate")
public class DataSource2Config {
@Bean(name = "master2DataSource")
@ConfigurationProperties(prefix = "master2.datasource")
public DataSource master2DataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "master2SqlSessionFactory")
public SqlSessionFactory master2SqlSessionFactory(@Qualifier("master2DataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master2/*.xml"));
// 分页拦截器-begin
PageInterceptor pageHelper = new PageInterceptor();
Properties properties = new Properties();
properties.setProperty("helperDialect", "com.github.pagehelper.dialect.helper.SqlServerDialect");
properties.setProperty("offsetAsPageNum", "true");
properties.setProperty("rowBoundsWithCount", "false");
properties.setProperty("reasonable", "false");
pageHelper.setProperties(properties);
bean.getObject().getConfiguration().addInterceptor(pageHelper);
return bean.getObject();
}
@Bean(name = "master2TransactionManager")
public DataSourceTransactionManager master2TransactionManager(@Qualifier("master2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "master2SqlSessionTemplate")
public SqlSessionTemplate master2SqlSessionTemplate(
@Qualifier("master2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
注意:
A:只能有一个主数据源,用注解@Primary表示
B:@MapperScan属性basePackages,表示数据源对应的mapper文件目录
3、springBoot配置文件
master1.datasource.url=jdbc:sqlserver://ip1:1433; DatabaseName=db1
master1.datasource.username=xx
master1.datasource.password=xxxxxx
master1.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
master2.datasource.url=jdbc:sqlserver://ip2:1433; DatabaseName=db2
master2.datasource.username=xx
master3.datasource.password=xxxxxx
master2.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
二:多数据源事务控制
1、启动文件,配置事务注解@EnableTransactionManagement
@Controller
@SpringBootApplication
@EnableSwagger2
@EnableTransactionManagement
public class BootMain extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(BootMain.class);
}
public static void main(String[] args) {
SpringApplication.run(BootMain.class, args);
}
}
2、接口实现配置事务注解@Transactional
如果是单一数据源,只需要在service实现的方法上加上@Transactional即可。
如果是多数据源,需要指定事务管理器名称
@Transactional(value = "master2TransactionManager", rollbackFor = { Exception.class })
我在微信订阅号等你!