Spring Boot Dersleri – Çoklu Veritabanları İle Çalışmak (Spring Data)
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>
Code language: HTML, XML (xml)
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);
}
}
Code language: PHP (php)
Öğ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);
}
}
Code language: PHP (php)
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;
.
.
}
Code language: CSS (css)
@Entity
@Table(name = "Ogrenci")
public class Ogrenci {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@Column(name = "ad")
private String ad;
.
.
}
Code language: CSS (css)
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);
}
Code language: PHP (php)
@Repository
public interface OgrenciRepository extends JpaRepository<Ogrenci, Long> {
Ogrenci findById(Long id);
}
Code language: PHP (php)
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();
}
}
Code language: PHP (php)
return builder
.dataSource(dataSource)
.packages(“com.ogretmenogrenci.ogretmen.domain”)
.persistenceUnit(“ogretmen”)
.build();
burada ki persistenceUnit ismini nereden alıyoruz acaba