[JAVA] Méthode d'implémentation pour source multi-données avec Spring boot (Mybatis et Spring Data JPA)

Nous organiserons la méthode de mise en œuvre lors de l'utilisation de sources multi-données avec Spring boot.

Pour Mybatis

Étant donné qu'Autoconfig est utilisé, les informations de connexion à la base de données sont décrites dans application.properties.

application.properties


#DB primaire
spring.datasource.url=jdbc:mysql://localhost:3306/primary_db?useSSL=false
spring.datasource.username=demo
spring.datasource.password=demo
spring.datasource.driverClassName=com.mysql.jdbc.Driver

#DB secondaire
secondary.datasource.url=jdbc:mysql://localhost:3306/secondary_db?useSSL=false
secondary.datasource.username=demo
secondary.datasource.password=demo
secondary.datasource.driverClassName=com.mysql.jdbc.Driver

Créez la classe principale Spring Boot comme vous le feriez normalement.

DemoApplication


@SpringBootApplication
public class DemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args).close();
	}
}

Définissez la source de données principale et sqlSession. -Package de base de classe de référentiel -Dossier de stockage SQLMap

PrimaryDbConfig


@Configuration
@MapperScan(basePackages = PrimaryDbConfig.BASE_PACKAGES
            , sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PrimaryDbConfig {
	public static final String BASE_PACKAGES = "com.example.demo.primary";
	public static final String MAPPER_XML_PATH = "classpath:com/example/demo/primary/*.xml";

	@Primary
	@Bean(name = "primaryDataSource")
	@ConfigurationProperties(prefix = "spring.datasource")
	public DataSource dataSource() {
		return new DataSource();
	}

	@Primary
	@Bean(name = "primarySqlSessionFactory")
	public SqlSessionFactory sqlSessionFactory(@Qualifier("primaryDataSource") DataSource primaryDataSource)
			throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(primaryDataSource);
		bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_XML_PATH));
		return bean.getObject();
	}

	@Bean(name = "primarySqlSessionTemplate")
	public SqlSessionTemplate sqlSessionTemplate(
			@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

Définissez une source de données secondaire et une sqlSession comme ci-dessus.

SecondaryDbConfig


@Configuration
@MapperScan(basePackages = SecondaryDbConfig.BASE_PACKAGES
            , sqlSessionTemplateRef = "secondarySqlSessionTemplate")
public class SecondaryDbConfig {
	public static final String BASE_PACKAGES = "com.example.demo.secondary";
	public static final String MAPPER_XML_PATH = "classpath:com/example/demo/secondary/*.xml";
	
	@Bean(name = "secondaryDataSource")
	@ConfigurationProperties(prefix = "secondary.datasource")
	public DataSource dataSource() {
		return new DataSource();
	}

	@Bean(name = "secondarySqlSessionFactory")
	public SqlSessionFactory sqlSessionFactory(@Qualifier("secondaryDataSource") DataSource secondaryDataSource)
			throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(secondaryDataSource);
		bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_XML_PATH));
		return bean.getObject();
	}

	@Bean(name = "secondarySqlSessionTemplate")
	public SqlSessionTemplate sqlSessionTemplate(
			@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

Créez chaque classe de référentiel.

PrimaryRepository


@Mapper
public interface PrimaryRepository {
	public long selectCountFromPrimary();
}

SecondaryRepository


@Mapper
public interface SecondaryRepository {
	public long selectCountFromSecondary();
}

Définissez le SqlMap principal dans le dossier de ressources suivant.

com
 |-example
     |-demo
         |-primary
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        
<mapper namespace="com.example.demo.primary.PrimaryRepository">

    <select id="selectCountFromPrimary" resultType="long">
        select count(*) from emp;
    </select>
</mapper>

Définissez un SqlMap secondaire dans le dossier de ressources suivant.

com
 |-example
     |-demo
         |-secondary
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        
<mapper namespace="com.example.demo.secondary.SecondaryRepository">

    <select id="selectCountFromSecondary" resultType="long">
        select count(*) from emp2;
    </select>
</mapper>

Appelez le référentiel ci-dessus et exécutez SQL.

	@Autowired
    private PrimaryRepository primaryRepository;
	@Autowired
    private SecondaryRepository secondaryRepository;

    ...
    long countPrimary = primaryRepository.selectCountFromPrimary();
    long countSecondary = secondaryRepository.selectCountFromSecondary();

Pour Spring Data JPA

Comme avec Mybatis, décrivez les informations de connexion à la base de données dans application.properties.

application.properties


#DB primaire
spring.datasource.url=jdbc:mysql://localhost:3306/primary_db?useSSL=false
spring.datasource.username=demo
spring.datasource.password=demo
spring.datasource.driverClassName=com.mysql.jdbc.Driver

#DB secondaire
secondary.datasource.url=jdbc:mysql://localhost:3306/secondary_db?useSSL=false
secondary.datasource.username=demo
secondary.datasource.password=demo
secondary.datasource.driverClassName=com.mysql.jdbc.Driver

spring.jpa.database=default

Créez la classe principale Spring Boot comme vous le feriez normalement.

DemoApplication


@SpringBootApplication
public class DemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

Définissez la source de données principale, le entityManager et le transactionManager. -Package de base de classe de référentiel -Package de base de classe de domaine

PrimaryDbConfig


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory"
                       , transactionManagerRef = "transactionManager"
                       , basePackages = { "com.example.demo.primary" })
public class PrimaryDbConfig {

	@Primary
	@Bean(name = "dataSource")
	@ConfigurationProperties(prefix = "spring.datasource")
	public DataSource dataSource() {
		return DataSourceBuilder.create().build();
	}

	@Primary
	@Bean(name = "entityManagerFactory")
	public LocalContainerEntityManagerFactoryBean entityManagerFactory(
			EntityManagerFactoryBuilder builder,
			@Qualifier("dataSource") DataSource dataSource) {
		return builder.dataSource(dataSource).packages("com.example.demo.primary.domain").build();
	}

	@Primary
	@Bean(name = "transactionManager")
	public PlatformTransactionManager transactionManager(
			@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
		return new JpaTransactionManager(entityManagerFactory);
	}
}

Définissez la source de données secondaire, le entityManager et le transactionManager comme ci-dessus.

SecondaryDbConfig


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "secondaryEntityManagerFactory"
                       , transactionManagerRef = "secondaryTransactionManager"
                       , basePackages = {"com.example.demo.secondary" })
public class SecondaryDbConfig {

	@Bean(name = "secondaryDataSource")
	@ConfigurationProperties(prefix = "secondary.datasource")
	public DataSource dataSource() {
		return DataSourceBuilder.create().build();
	}

	@Bean(name = "secondaryEntityManagerFactory")
	public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(
			EntityManagerFactoryBuilder builder,
			@Qualifier("secondaryDataSource") DataSource dataSource) {
		return builder.dataSource(dataSource).packages("com.example.demo.secondary.domain").build();
	}

	@Bean(name = "secondaryTransactionManager")
	public PlatformTransactionManager secondaryTransactionManager(
			@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory secondaryEntityManagerFactory) {
		return new JpaTransactionManager(secondaryEntityManagerFactory);
	}
}

Créez chaque classe de référentiel et classe de domaine.

PrimaryRepository


@Repository
public interface PrimaryRepository extends CrudRepository<Emp, String> {
	public long count();	
}

SecondaryRepository


@Repository
public interface SecondaryRepository extends CrudRepository<Emp2, String> {
	public long count();
}

EmpDomain


@Entity
@Table(name="emp")
public class Emp {
	
	@Id
	@Column(name="emp_id")
	private String empId;

	@Column(name="dept_id")
	private String deptId;

	...
}

EmpDomain2


@Entity
@Table(name="emp2")
public class Emp2 {
	
	@Id
	@Column(name="emp_id")
	private String empId;

	@Column(name="dept_id")
	private String deptId;

	...

Appelez la classe du référentiel avec le même sentiment que Mybatis.

	@Autowired
    private PrimaryRepository primaryRepository;
	@Autowired
    private SecondaryRepository secondaryRepository;

    ...
    long countPrimary = primaryRepository.selectCountFromPrimary();
    long countSecondary = secondaryRepository.selectCountFromSecondary();

Recommended Posts

Méthode d'implémentation pour source multi-données avec Spring boot (Mybatis et Spring Data JPA)
Jusqu'à l'acquisition de données avec Spring Boot + MyBatis + PostgreSQL
Compatibilité de Spring JDBC et My Batis avec Spring Data JDBC (provisoire)
J'ai essayé le guide d'introduction de Spring Boot [Accès aux données avec JPA]
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
Voir le comportement des mises à jour d'entités avec Spring Boot + Spring Data JPA
Créer une API REST avec Spring JPA Data avec REST et Lombok incroyablement facile.
Spring avec Kotorin --2 RestController et Data Class
HTTPS avec Spring Boot et Let's Encrypt
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Mettre à jour périodiquement la base de données avec Spring Batch et My Batis
Référence mutuelle de l'entité de Spring Data JPA et ses notes
Créez une application CRUD avec Spring Boot 2 + Thymeleaf + MyBatis
Exemple de code pour le contrôle de la base de données par transaction déclarative avec Spring Boot + Spring Data JPA
Trier par Spring Data JPA (avec tri par clé composée)
Création d'un référentiel commun avec Spring Data JPA
Spring Boot + Spring Data JPA À propos des jointures de table multiples
Vérifiez le comportement de getOne, findById et des méthodes de requête avec Spring Boot + Spring Data JPA
Plans pour prendre en charge JDK 11 pour Eclipse et Spring Boot
Paramètres de connexion à MySQL avec Spring Boot + Spring JDBC
Test des entités et référentiels JPA à l'aide de Spring Boot @DataJpaTest
Essayez d'utiliser un conteneur DI avec Laravel et Spring Boot
Un mémorandum lors de l'essai de Spring Data JPA avec STS
Mémo d'utilisation de Spring Security: coopération avec Spring MVC et Boot
Spring Boot avec les paramètres du filtre de sécurité Spring et les points addictifs
J'ai essayé de démarrer avec Spring Data JPA
Jusqu'à l'utilisation de Spring Data et JPA Part 2
Jusqu'à l'utilisation de Spring Data et JPA Part 1
Tentative de SSR Vue.js avec Spring Boot et GraalJS
Connectez Spring Boot et Angular en toute sécurité avec OpenAPI Generator
Télécharger avec Spring Boot
[Spring Data JPA] La condition And peut-elle être utilisée dans la méthode de suppression implémentée automatiquement?
Comment utiliser la même classe Mapper dans plusieurs sources de données avec Spring Boot + MyBatis
Changez la cible d'injection pour chaque environnement avec Spring Boot 2
Jusqu'à INSERT et SELECT sur Postgres avec botte de printemps et feuille de thym
Développement piloté par domaine avec Java et Spring Boot-Layer et division de modules
8 choses à insérer dans DB en utilisant Spring Boot et JPA
[Java] Exemple de projet de développement d'applications Web avec Spring Boot
Méthode de configuration de la connexion Spring + MyBatis
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
[spring] Utilisons Spring Data JPA
Bonjour tout le monde avec Spring Boot!
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Spring Boot pour l'apprentissage des annotations