Nautilus Maceraları

Kişisel laboratuvar

Spring Boot Hibernate ile PostgreSQL'e Bağlanmak

Merhaba.

Spring Boot ile oluşturduğumuz Web Api projesi üzerinden PostgreSQL veritabanına nasıl erişim sağlayabiliriz, inceliyor olacağız.

Öncelikle postgresql ile ilgili dependencymizi pom.xml dosyamıza ekleyelim.

		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<scope>runtime</scope>
		</dependency>

Application.properties dosyamıza gerekli configurasyonları atayalım. Benim default portum kullanıldığı için farklı bir porta atama yaptım. Proje her çalıştığında database'in drop/create olmaması şçin ddl-auto özelliğini update olarak atayalım. Platfom, Datasourse, username, password özelliklerini atayalım.

server.port=8081

spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

spring.datasource.url=jdbc:postgresql://localhost:5432/dbTraining
spring.datasource.username=postgres
spring.datasource.password=postgres

Örnek modelimizi oluşturalım. Tabi doğrudan modeli oluşturmadan önce OOP kurallarına da uyarak bir BaseEntity oluşturalım. 

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {

	@CreationTimestamp
	public Date saveDate;
	@UpdateTimestamp
	public Date updateDate;
	public Boolean isActive=true;
	
	
	public Boolean getIsActive() {
		return isActive;
	}
	public void setIsActive(Boolean isActive) {
		this.isActive = isActive;
	}
}

MappedSuperclass
Entityler, persistence durumunu ve mapping bilgilerini içeren ve Entity olmayan bir superclass’tan inherit olabilir. Bu superclass “@Entity” notasyonu ile tanımlanmaz ve Java Persistence Provider tarafından entity olarak belirlenmez. Bu classları genellikle ortak state ve mapping bilgisi olan entitylerimiz olduğunda kullanırız.

EntityListeners

Entityler üzerinde gerçekleşen değişiklikleri yakalar ve gerekli işlemleri yapar. 

Todo.java entity.

@Entity
@Table(name="todo",schema = "todos")
public class ToDo extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int id;
public String title;
public String summary;
public String description;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getSummary() {
return summary;
}

public void setSummary(String summary) {
this.summary = summary;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}
}

Şimdi sırada PostgreSQL üzerinde dbTraining adında bir veritabanı ve todos adında bir şema oluşturmaya. Bu işlemleri yapmazsanız çalışma zamanında dataSource'unuzun bulunamadığı ile alakalı hatalar bizleri bekliyor olacak.

Bu entity'miz üzerinde CRUD işlemleri yapabilmek için springframework.data.repository.CrudRepository namespace'ini ekliyoruz. ToDoRepository adında bir interface oluşturup CrudRepository interface'inden implemente ediyoruz.

@Repository
public interface ToDoRepository extends CrudRepository<ToDo,Integer>{

}

@Repository ile interface'imize Repository olarak işlem yapacağını bildiriyoruz.

Şimdi de ToDoRepository interface'imiz üzerindeki iş kurallarımızı oluşturmak için bir service sınıfı oluşturuyoruz. 

@Service
public class ToDoService {

@Autowired
private ToDoRepository toDoRepository;

public List<ToDo> getAllToDos() {

List<ToDo> toDos = new ArrayList<>();

toDoRepository.findAll().forEach(toDos::add);

return toDos;
}

public ToDo getToDo(Integer id) {
return toDoRepository.findById(id).get();
}

public void createToDo(ToDo toDo) {
toDoRepository.save(toDo);
}

public void updateToDo(Integer id, ToDo toDo) {
toDoRepository.save(toDo);
}

public void deleteToDo(Integer id) {
toDoRepository.deleteById(id);
}
}

@Service attribute'ü ile sınıfımızın bir servis olduğunu bildiriyoruz. İçerisinde belirttiğimiz toDoRepository fieldımızı da @Autowired attribute'ü ile niteliyoruz. 

@Autowired ile ilgili fieldımız initation zamanında otomatik olarak getter ve setter işlemlerini yapar.

Controllerımızı da oluşturup servisimizi dış dünyaya açalım. 

@RestController
@RequestMapping("/v1/todos")
public class ToDoController {
@Autowired
private ToDoService toDoService;

@GetMapping
public List<ToDo> getAllToDos() {
return toDoService.getAllToDos();
}

@RequestMapping("/{id}")
public ToDo getToDo(@PathVariable Integer id) {
return toDoService.getToDo(id);
}

@RequestMapping(method = RequestMethod.POST)
public void createToDo(@RequestBody ToDo todo) {
toDoService.createToDo(todo);
}

@RequestMapping(method = RequestMethod.PUT, value = "/{id}")
public void updateToDo(@PathVariable Integer id, @RequestBody ToDo todo) {
toDoService.updateToDo(id, todo);
}

@RequestMapping(method = RequestMethod.DELETE, value = "/{id}")
public void deleteToDo(@PathVariable Integer id) {
toDoService.deleteToDo(id);
}
}

Postman aracı ile web apimiz üzerinden örnek bir veri yazma ve okuma işlemi gerçekleştirelim.

Verileri okumak için:

Bir sonraki yazımızda görüşmek üzere. :)

Kaynaklar: 

https://medium.com/kodgemisi/entity-inheritance%C4%B1n-p%C3%BCf-noktalar%C4%B1-65ed7fdf93c

 

 

Loading