Перейти к основному содержимому

5.12. Работа с БД

Разработчику Архитектору

Работа с БД

GORM (Grails ORM) - ORM, используемый во фреймворке Grails. Прост в использовании, интегрирован с Spring, применяется в веб-приложениях на Grails.

GORM — это реализация паттерна Active Record для Groovy, позволяющая легко работать с базами данных. Он скрывает сложность SQL и Hibernate под простым и интуитивно понятным API.

GORM построен на основе Hibernate Core, поддерживает реляционные БД (PostgreSQL, MySQL, H2 и др.), интегрирован с Spring Boot. Работает как в Grails, так и автономно в standalone-приложениях.

Как работать с GORM?

  1. Создание доменных классов (Domain Classes)
class Book {
String title
String author
BigDecimal price
Date releaseDate

static constraints = {
title blank: false, maxSize: 100
author nullable: true
}
}

Каждый такой класс автоматически становится таблицей в БД (book), а поля — столбцами.

  1. Основные операции CRUD

Создание:

def book = new Book(title: "Groovy in Action", author: "Dierk König", price: 49.99)
book.save()

Чтение:

def book = Book.get(1) // По ID
def books = Book.findAllByAuthor("Dierk König")

Обновление:

def book = Book.get(1)
book.price = 39.99
book.save()

Удаление:

def book = Book.get(1)
book.delete()
  1. Динамические методы поиска

GORM предоставляет множество удобных методов:

Book.findByTitle("Groovy in Action")
Book.findAllByPriceLessThan(50.0)
Book.countByAuthor("Dierk König")
Book.findAllByReleaseDateBetween(startDate, endDate)
  1. Связи между доменами

Пример связи один ко многим:

class Author {
String name
static hasMany = [books: Book]
}

class Book {
String title
static belongsTo = [author: Author]
}

Теперь можно делать:

def author = new Author(name: "Dierk König").save()
def book = new Book(title: "Groovy in Action").save()
author.addToBooks(book).save()

// Получить все книги автора
author.books.each { println it.title }

Можно явно указать, как будет выглядеть таблица в БД:

class Book {
String title

static mapping = {
table 'books'
title column: 'book_title', length: 255
}
}

Работа с транзакциями

Book.withTransaction { status ->
def book = new Book(title: "New Book")
if (book.save()) {
// ...
} else {
status.setRollbackOnly()
}
}

GORM можно использовать и без Grails, например, в Spring Boot приложениях.

Для этого нужно добавить зависимость в build.gradle и использовать доменные классы и сервисы в контроллерах или сервисах Spring.