一个项目大部分都是单一数据库多一些,但是有时候会需要用多个库,所以这时候据需要使用多数据源。我这里使用springboot+mybatis(plus)+druid多数据源.
目前我知道有两种方式,一种方式是需要在service实现类上添加@DS,一种方式是通过配置的方式,配置不同的SqlSessionFactory实现。
1. 第一种方式
这种方式主要通过配置不同的SqlSessionFactory实现。
1.1 引入依赖
<dependencies>
<!-- 第一步:选择ORM框架,使用springboot整合mybatis-plus依赖包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- 第二步:选择数据库驱动,这里是Mysql所以就选择Mysql的驱动,PG的就选择PG-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- 第三步(可选):数据库连接池,可以使用druid的连接池。springboot-jdbc已经默认依赖了Hikari的连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
</dependencies>
1.2 增加配置
#druid数据库链接池配置
spring:
datasource:
#1.JDBC
type: com.alibaba.druid.pool.DruidDataSource
druid:
myboot:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/myboot?useUnicode=true&characterEncoding=utf8
username: root
password: root
mydatabase:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf8
username: root
password: root
1.3 配置myboot的源连接
@Configuration
@MapperScan(basePackages = "com.lx.mybatisplus.myboot.mappers", sqlSessionTemplateRef = "mybootSqlSessionTemplate")
public class MyBootDataSourceConfig {
@Bean(name = "myboot")
@ConfigurationProperties(prefix = "spring.datasource.druid.myboot")
public DruidDataSource myboot() {
DruidDataSource myboot = new DruidDataSource();
return myboot;
}
@Primary
@Bean("mybootSqlSessionFactory")
public SqlSessionFactory psiSqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
factoryBean.setDataSource(myboot());
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
configuration.setJdbcTypeForNull(JdbcType.NULL);
factoryBean.setConfiguration(configuration);
//指定xml路径.
// factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/a/b/c/d/e/psi/mapper/*Dao.xml"));
//这里可以设置MetaObjectHandler
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new MetaObjectHandler() {
@Override
public void insertFill(MetaObject metaObject) {
}
@Override
public void updateFill(MetaObject metaObject) {
}
});
factoryBean.setGlobalConfig(globalConfig);
return factoryBean.getObject();
}
@Bean("mybootTransactionManager")
@Primary
// 数据源事务管理器
public DataSourceTransactionManager mybootTransactionManager(@Qualifier("myboot") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Primary
@Bean("mybootSqlSessionTemplate")
public SqlSessionTemplate psiSqlSessionTemplate() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(psiSqlSessionFactory()); // 使用上面配置的Factory
return template;
}
}
1.4 配置mydatabase的源连接
@Configuration
@MapperScan(basePackages = "com.lx.mybatisplus.mydatabase.mappers", sqlSessionTemplateRef = "mydatabaseSqlSessionTemplate")
public class MyDataBaseDataSourceConfig {
@Primary
@Bean(name = "mydatabase")
@ConfigurationProperties(prefix = "spring.datasource.druid.mydatabase")
public DruidDataSource mydatabase() {
return new DruidDataSource();
}
@Bean("mydatabaseSqlSessionFactory")
public SqlSessionFactory mydatabaseSqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
factoryBean.setDataSource(mydatabase());
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
configuration.setJdbcTypeForNull(JdbcType.NULL);
factoryBean.setConfiguration(configuration);
return factoryBean.getObject();
}
@Bean("mydatabaseTransactionManager")
// 数据源事务管理器
public DataSourceTransactionManager mydatabaseTransactionManager(@Qualifier("mydatabase") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean("mydatabaseSqlSessionTemplate")
public SqlSessionTemplate b2bSqlSessionTemplate() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(mydatabaseSqlSessionFactory()); // 使用上面配置的Factory
return template;
}
}
因为是两个源,所以使用了两个事务管理。需要使用 @Transcational() 注解来使用事务管理器。
但是我们实际上注册了两个, 如果不指定事务管理器的, springboot是不知道该使用那个的。
不过我们在注册的时候,在 @Bean(name = "mybootTransactionManager"), 这一行下面使用了 @Primary 注解。所以我们的spring会默认使用 mybootTransactionManager这个事务管理器。
如果当你需要用到 另一个事务管理器的时候,你需要在你的 @Transcational 注解中指定事务管理器名称
ps: 使用事务的方法或者类上指定事务管理器。
@Transactional(readOnly = true, transactionManager = "mybootTransactionManager")
@Transactional(readOnly = true, transactionManager = "mydatabaseTransactionManager")
这样就配置完成了,因为指定了basePackages 对应的sqlSessionTemplateRef,所以就可以区分不同的源配置了
2.第二种方式
这种方式主要使用@DS注解,在使用的地方指定就行
2.1 依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
2.2 配置文件
#druid数据库链接池配置
spring:
datasource:
#1.JDBC
type: com.alibaba.druid.pool.DruidDataSource
druid:
myboot:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/myboot?useUnicode=true&characterEncoding=utf8
username: root
password: root
mydatabase:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf8
username: root
password: root
2.3 在service实现类上添加@DS
@Service
@DS("myboot")
public class ProductServiceImpl extends ServiceImpl<ProductMapper,Product> implements ProductService {
}
@Service
@DS("mydatabase")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
这样就完成了配置不同源,但是这种方式局限性太大,所以建议还是使用第一种方式。
参考:
Springboot+mybatis(plus)+druid多数据源 - 知乎
Java学习 --- mybatisplus配置多数据源_鸭鸭老板的博客-CSDN博客_mybatisplus多数据源配置