前言
来啦老铁!
学习路径
- 修改项目启动类;
- 修改项目配置文件;
- 增加 MybatisConfig.java 配置文件;
- 调整项目目录结构;
1. 修改项目启动类;
- 删除 @MapperScan 注解,例如单 mysql 时:
package priv.dylan.space;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages = {"priv.dylan"})
@MapperScan(basePackages = "priv.dylan.space.mapper")
public class SpaceApplication {
public static void main(String[] args) {
SpringApplication.run(SpaceApplication.class, args);
System.out.println("Hello World~");
}
}
改为:
package priv.dylan.space;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages = {"priv.dylan"})
public class SpaceApplication {
public static void main(String[] args) {
SpringApplication.run(SpaceApplication.class, args);
System.out.println("Hello World~");
}
}
2. 修改项目配置文件;
- 找到项目配置文件:application.yml 或 application.propertities 文件;
- spring 下的 datasource 节点改造为 2 个 mysql 的配置,如:
spring:
application:
name: utils
datasource:
primary:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3307/my_db?useSSL=false
username: root
password: root
secondary:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://xx.xxx.xxx.xx:3306/xx_xx?useSSL=false
username: xxxxxx
password: xxxxxx
注:
a. primary 和 secondary 是自己定义的,可以使用任意文本
b. 修改 mybatis 配置,删除 mapper-locations 和 type-aliases-package,如:
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: priv.dylan.space.entity
...
改为:
mybatis:
...
3. 增加 MybatisConfig.java 配置文件;
- 代码参考如下:
package priv.dylan.space.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
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.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
public class MybatisConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource firstDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory firstSqlSessionFactory(DataSource firstDataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(firstDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/mydb/*.xml"));
return sessionFactory.getObject();
}
@Bean
public SqlSessionFactory secondSqlSessionFactory(DataSource secondDataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(secondDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/testdb/*.xml"));
return sessionFactory.getObject();
}
@Bean
public MapperScannerConfigurer firstMapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactoryBeanName("firstSqlSessionFactory");
mapperScannerConfigurer.setBasePackage("priv.dylan.space.mapper.mydb");
return mapperScannerConfigurer;
}
@Bean
public MapperScannerConfigurer secondMapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactoryBeanName("secondSqlSessionFactory");
mapperScannerConfigurer.setBasePackage("priv.dylan.space.mapper.testdb");
return mapperScannerConfigurer;
}
}
注:
a. @ConfigurationProperties(prefix = "spring.datasource.primary")
和 @ConfigurationProperties(prefix = "spring.datasource.secondary") 中的 primary 和 secondary 要与项目配置文件 application.yml 或 application.properities 文件中关于 mysql 数据的配置名一致;
b.为不同的 mapper 接口类配置不同的 SqlSessionFactory 这一点非常重要,如 firstMapperScannerConfigurer 方法和 secondMapperScannerConfigurer;
firstMapperScannerConfigurer 指定了 priv.dylan.space.mapper.mydb 这底下的类全部使用 firstSqlSessionFactory,也就是使用 classpath:mappers/mydb/*.xml 这底下的 mapper xml 文件;
而 firstSqlSessionFactory 又使用了 firstDataSource,也就是第一个 mysql 配置去链接 mysql;
c. secondMapperScannerConfigurer 类似;
这样,我们为每个 mapper 接口类指定了 mapper xml 文件,并且指定了执行 sql 的数据库信息,也就能做到支持多个数据库了;
4. 调整项目目录结构;
-
entity 包按不同数据库划分(建议);
-
mapper 包按不同数据库划分;
-
mapper xml 按不同数据库划分;
-
其他如 service 层、controller 层、domain 等,自行评估,可选;
-
结构如:

如此,就能在 springboot3 项目中使用2个或多个 mysql 数据库啦~
当然,我们还可以参考使用 dynamic-datasource-spring-boot-starter 包:
《Spring Boot之多数据库源:极简方案》
如果本文对您有帮助,麻烦点赞、关注!
谢谢!
网友评论