Spring Boot Mybatisデータベースdatasourceマルチデータソース構成


application.yamlファイル構成
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の構成、キーは構成コードのコメントを参照
  • DataSourceはアプリケーションに依存する.yamlでの構成
  • SqlSessionFactory依存DataSource
  • SqlSessionTemplate依存SqlSessionFactory
  • @MapperScan注記のbasePackagesプロパティは、Mapperファイルパッケージ名
  • @MapperScan注記のsqlSessionTemplateRef属性値は、注入されたSqlSessionTemplateオブジェクト
  • SqlSessionFactoryBeanのsetMapper Locationsメソッドxml Mapperファイルパスの設定
  • ここに注入されたトランザクション管理オブジェクトDataSourceTransactionManagerはここでは使用されていません.@Transactional(value="dataSourceTransactionManager 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ファイル名と同名であることに注意してください.
  • 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をロールバックする
    @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);
        }
    }