Spring Boot Dersleri – Çoklu Veritabanları İle Çalışmak (Spring Data)

Spring Boot
Spring Dersleri

Spring Boot Dersleri‘ne devam ediyoruz.

Spring Boot uygulamlarımızda birden fazla farklı veritabanları ile nasıl çalışır, farklı veritabanlarına nasıl bağlanılır bir örnek ile açıklayacağım. Birden fazla veritabanına bağlanma işlemi aslında Spring Data’nın özelliğidir ancak asıl amacım bu özelliğin Spring Boot uygulamasında nasıl çalıştığını ve eklendiğini anlatmak.

Yapacağımız örnekte iki farklı veritabanımız olacak ve Spring Data özelliklerinden faydalanarak bağlanabileceğiz. Yapacağımız Spring Boot uygulaması örneğinde 2 farklı veritabanına bağlanacağız biri Mysql diğeri ise PostgreSQL olacak.

Maven bağımlılığımızı ekleyelim.

<dependencies> 
   <dependency> 
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter</artifactId> 
   </dependency> 
   <dependency> 
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jpa</artifactId>
   </dependency>
   <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
   </dependency> 
   <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <scope>runtime</scope>
   </dependency>
</dependencies>

Veritabanı bağlantısını bilgilerini tanımlamak için application.properties dosyasına bilgileri yazalım.

# POSTGRESQL

spring.postgresql.datasource.url=jdbc:postgresql://localhost:5432/ogrenci 
spring.postgresql.datasource.username=postgres 
spring.postgresql.datasource.password= 
spring.postgresql.datasource.driver-class-name=org.postgresql.Driver 

# MYSQL 

spring.mysql.datasource.url=jdbc:mysql://localhost:3306/ogretmen?autoReconnect=true&useSSL=false 
spring.mysql.datasource.username=root 
spring.mysql.datasource.password= 
spring.mysql.datasource.driver-class-name=com.mysql.jdbc.Driver

Veritabanı bağlantı bilgilerimizi doldurduk.

Şimdi proje yapımızı aşağıdaki şekilde oluşturacağız.

 src/main/java
- com.ogretmenogrenci
  - ogretmen
    - domain
    - repo
  - ogrenci
    - domain
    - repo 

Sonrasında ise Öğretmen veritabanımızı için konfigürasyonlarımı her iki veritabanımız için de yapacağız.

Öğretmen veritabanı ayarlarımızı yapalım.

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "entityManagerFactory",
  basePackages = { "com.ogretmenogrenci.ogretmen.repo" }
)
public class ogretmenDbConfig {
  
  @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.ogretmenogrenci.ogretmen.domain")
      .persistenceUnit("ogretmen")
      .build();
  }
    
  @Primary
  @Bean(name = "transactionManager")
  public PlatformTransactionManager transactionManager(
    @Qualifier("entityManagerFactory") EntityManagerFactory 
    entityManagerFactory
  ) {
    return new JpaTransactionManager(entityManagerFactory);
  }
}

Öğrenci veritabanı ayarlamaları yapalım.

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "entityManagerFactory",
  basePackages = { "com.ogrenciogrenci.ogrenci.repo" }
)
public class ogrenciDbConfig {
  
  @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.ogrenciogrenci.ogrenci.domain")
      .persistenceUnit("ogrenci")
      .build();
  }
    
  @Primary
  @Bean(name = "transactionManager")
  public PlatformTransactionManager transactionManager(
    @Qualifier("entityManagerFactory") EntityManagerFactory 
    entityManagerFactory
  ) {
    return new JpaTransactionManager(entityManagerFactory);
  }
}

Veritabanı entitylerimizi yapalım.

@Entity
@Table(name = "Ogretmen")
public class Ogretmen {
  
  @Id
  @GeneratedValue
  @Column(name = "ID")
  private Long id;
  
  @Column(name = "ad")
  private String ad;
  .
  .
}
@Entity
@Table(name = "Ogrenci")
public class Ogrenci {
  
  @Id
  @GeneratedValue
  @Column(name = "ID")
  private Long id;
  
  @Column(name = "ad")
  private String ad;
  .
  .
}

Repositoryimizi oluşturmamız gerekiyor. Bu repository sayesinde sql sorgularımızı entityler aracılığı ile yazabilmekteyiz.

@Repository
public interface OgretmenRepository extends JpaRepository<Ogretmen, Long> {
  
  Ogretmen findById(Long id); 
  
}
@Repository
public interface OgrenciRepository extends JpaRepository<Ogrenci, Long> {
  
  Ogrenci findById(Long id); 
  
}

Controllerimizi oluşturalım. Controllerimiz iki veritabanından tüm bilgileri çekelim.

@RestController
public class OgretmenOgrenciController {
  
  private final OgretmenRepository ogretmen;
  private final OgrenciRepository ogrenci;
  
  @Autowired
  OgretmenOgrenciController(OgretmenRepository ogretmen, OgrenciRepository ogrenci) {
    this.ogretmen = ogretmen;
    this.ogrenci = ogrenci;
  }
  
  @RequestMapping("/ogretmenogrenci/{id}")
  public String ogretmenogrenci(@PathVariable("id") Long id) {
    Ogretmen ogretmen = ogretmen.findById(id);
    Ogrenci ogrenci = ogrenci.findById(id);
    
    return ogretmen.getOgretmen() + " " + ogrenci.getOgrenci(); 
  }
}

Önceki Ders: Spring Boot Hata SayfalarıYapmak
Spring Boot Dersleri
Sonraki Ders: Security Basic Authentication Kullanım Örneği

Leave a Reply

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Burak KUTBAY 2010 - 2019
%d blogcu bunu beğendi: