Spring Boot Mybatisデータベースdatasourceマルチデータソース構成
application.yamlファイル構成
データソース関連Bean注入構成
データソース1の構成、キーは構成コードのコメントを参照DataSourceはアプリケーションに依存する.yamlでの構成 SqlSessionFactory依存DataSource SqlSessionTemplate依存SqlSessionFactory @MapperScan注記のbasePackagesプロパティは、Mapperファイルパッケージ名 @MapperScan注記のsqlSessionTemplateRef属性値は、注入されたSqlSessionTemplateオブジェクト SqlSessionFactoryBeanのsetMapper Locationsメソッドxml Mapperファイルパスの設定 ここに注入されたトランザクション管理オブジェクトDataSourceTransactionManagerはここでは使用されていません.@Transactional(value="dataSourceTransactionManager 1")注釈で使用できます.
データソース2の構成は、データソース1の構成と同様に、アプリケーションに依存する.yamlのdb 2は構成されており、注入された関連beanの名前は異なります.
JAva Mapperファイル
db 1対応のMapper javaファイルはcomに格納.yeyuanxinyi.mapper 1パッケージ
db 2対応のMapper javaファイルはcomに格納.yeyuanxinyi.mapper 2パッケージ
xml Mapperファイル
db 1対応のMapper xmlファイルはresources/mapper 1パスの下に格納されます
db 2対応のMapper xmlファイルはresources/mapper 2パスの下に格納されます
具体的なファイルコードは貼らないで、ファイル名が対応するjava mapperファイル名と同名であることに注意してください. StudentMapper.xml TeacherMapper.xml
Service
DB 1 Configに@MapperScan(basePackages="com.yeyuanxinyi.mapper 1")が配置するため、StudentMapperはcom.yeyuanxinyi.mapper 1はパッケージ化されているので、StudentMapperはデータソースdb 1を使用します.
@Transactional(value="d a t a SourceTransactionManager 1")では、dataSourceTransactionManager 1がデータソースdb 1に関連付けられているため、異常が発生した場合にdb 1をロールバックする
DB 2 configに@MapperScan(basePackages="com.yeyuanxinyi.mapper 2")が配置されているため、TeacherMapperはcom.yeyuanxinyi.mapper 2はパッケージ化されているので、TeacherMapperはデータソースdb 2を使用します.
@Transactional(value="d a t a SourceTransactionManager 2")では、dataSourceTransactionManager 2がデータソースdb 2に関連付けられているため、異常が発生した場合にdb 2をロールバックする
spring:
datasource:
db1:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://192.168.0.1:3306/ellassay_dev?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
username: yeyuanxinyi
password: 123456
db2:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://192.168.0.2:3306/demo3q?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
username: yeyuanxiner
password: 123456
データソース関連Bean注入構成
データソース1の構成、キーは構成コードのコメントを参照
@Configuration
// basePackages Mapper ,sqlSessionTemplateRef SqlSessionTemplate bean
@MapperScan(basePackages = "com.yeyuanxinyi.mapper1", sqlSessionTemplateRef = "sqlSessionTemplate1")
public class DB1Config {
@Bean(name = "dataSource1") // bean
@ConfigurationProperties(prefix = "spring.datasource.db1") // application.yaml
@Primary
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
// DataSource dataSource1
@Bean(name = "sqlSessionFactory1")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource1") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// xml Mapper
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper1/*Mapper.xml"));
return bean.getObject();
}
// DataSource dataSource1
@Bean(name = "dataSourceTransactionManager1") // bean @Transactional , @Transactional(value = "dataSourceTransactionManager1")
@Primary
public DataSourceTransactionManager dataSourceTransactionManager(@Qualifier("dataSource1") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
// SqlSessionFactory sqlSessionFactory1
@Bean(name = "sqlSessionTemplate1") // @MapperScan sqlSessionTemplateRef
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
データソース2の構成は、データソース1の構成と同様に、アプリケーションに依存する.yamlのdb 2は構成されており、注入された関連beanの名前は異なります.
@Configuration
// basePackages Mapper ,sqlSessionTemplateRef SqlSessionTemplate bean
@MapperScan(basePackages = "com.yeyuanxinyi.mapper2", sqlSessionTemplateRef = "sqlSessionTemplate2")
public class DB2Config {
@Bean(name = "dataSource2") // bean
@ConfigurationProperties(prefix = "spring.datasource.db2") // application.yaml
@Primary
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
// DataSource dataSource2
@Bean(name = "sqlSessionFactory2") // bean @Transactional , @Transactional(value = "sqlSessionFactory2")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource2") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// xml Mapper
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper2/*Mapper.xml"));
return bean.getObject();
}
// DataSource dataSource2
@Bean(name = "dataSourceTransactionManager2") // bean @Transactional , @Transactional(value = "dataSourceTransactionManager2")
@Primary
public DataSourceTransactionManager dataSourceTransactionManager(@Qualifier("dataSource2") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
// SqlSessionFactory sqlSessionFactory2
@Bean(name = "sqlSessionTemplate2") // @MapperScan sqlSessionTemplateRef
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
JAva Mapperファイル
db 1対応のMapper javaファイルはcomに格納.yeyuanxinyi.mapper 1パッケージ
public interface StudentMapper {
List getAll();
Student get(Long id);
void insert(Student);
void update(Student);
void delete(Long id);
}
db 2対応のMapper javaファイルはcomに格納.yeyuanxinyi.mapper 2パッケージ
public interface TeacherMapper {
List getAll();
Teacher get(Long id);
void insert(Teacher);
void update(Teacher);
void delete(Long id);
}
xml Mapperファイル
db 1対応のMapper xmlファイルはresources/mapper 1パスの下に格納されます
db 2対応のMapper xmlファイルはresources/mapper 2パスの下に格納されます
具体的なファイルコードは貼らないで、ファイル名が対応するjava mapperファイル名と同名であることに注意してください.
Service
DB 1 Configに@MapperScan(basePackages="com.yeyuanxinyi.mapper 1")が配置するため、StudentMapperはcom.yeyuanxinyi.mapper 1はパッケージ化されているので、StudentMapperはデータソースdb 1を使用します.
@Transactional(value="d a t a SourceTransactionManager 1")では、dataSourceTransactionManager 1がデータソースdb 1に関連付けられているため、異常が発生した場合にdb 1をロールバックする
@Service()
// DB1Config dataSourceTransactionManager1
@Transactional(rollbackFor = Exception.class, value = "dataSourceTransactionManager1")
public class StudentService {
@Resource()
private StudentMapper studentMapper;
public List getAll() {
return studentMapper.getAll();
}
public Student get(Long id) {
return studentMapper.get();
}
public void insert(Teacher teacher) {
studentMapper.insert(teacher);
}
public void update(Teacher teacher) {
studentMapper.update(teacher);
}
public void delete(Long id) {
studentMapper.delete(id);
}
}
DB 2 configに@MapperScan(basePackages="com.yeyuanxinyi.mapper 2")が配置されているため、TeacherMapperはcom.yeyuanxinyi.mapper 2はパッケージ化されているので、TeacherMapperはデータソースdb 2を使用します.
@Transactional(value="d a t a SourceTransactionManager 2")では、dataSourceTransactionManager 2がデータソースdb 2に関連付けられているため、異常が発生した場合にdb 2をロールバックする
@Service()
// DB2Config dataSourceTransactionManager2
@Transactional(rollbackFor = Exception.class, value = "dataSourceTransactionManager2")
public class TeacherService {
@Resource()
private TeacherMapper teacherMapper;
public List getAll() {
return teacherMapper.getAll();
}
public Teacher get(Long id) {
return teacherMapper.get();
}
public void insert(Teacher teacher) {
teacherMapper.insert(teacher);
}
public void update(Teacher teacher) {
teacherMapper.update(teacher);
}
public void delete(Long id) {
teacherMapper.delete(id);
}
}