Uma Introdução ao Grails 3 e GORM
1. Visão geral
Esta é uma introdução rápida ao Grails 3 e GORM.
Vamos, é claro, usar Groovy e - implicitamente - a estrutura também usa Hibernate para ORM, Spring Framework para injeção de dependência, SiteMash para layout e temas, etc.
2. Configuração do DataSource
Podemos começar sem precisar especificar nenhuma configuração explícita da fonte de dados - por padrão, o Grails usa o banco de dados HSQLDB para os ambientes de desenvolvimento e teste.
Mas se você quiser alterar esses padrões, você pode definir sua fonte de dados selecionada noapplication.yml:
environments:
development:
dataSource:
driverClassName : "com.mysql.jdbc.Driver"
url : "jdbc:mysql://localhost:8080/test"
dialect : org.hibernate.dialect.MySQL5InnoDBDialect
Da mesma forma, podemos criar vários ambientes aqui, ao lado dedevelopment, se necessário.
3. Domínio
Grails é capaz de criar a estrutura de banco de dados para nossas classes de domínio, com base na propriedadedbCreate na configuração do banco de dados.
Vamos definir uma dessas classes de domínio aqui:
Class User {
String userName
String password
String email
String age
static constraints = {
userName blank: false, unique: true
password size: 5..10, blank: false
email email: true, blank: true
}
}
Observe como estamos especificando nossovalidation constraints right in the model, o que mantém as coisas limpas e livres de anotações.
Essas restrições serão verificadas pelo Grails automaticamente quando a entidade estiver sendo persistida e a estrutura lançará exceções de validação apropriadas se alguma dessas restrições for quebrada.
Também podemos especificar mapeamentos GORM na propriedademapping do modelo:
static mapping = { sort "userName" }
Agora, se chamarmosUser.list() - receberemos os resultadossorted by username.
É claro que poderíamos obter o mesmo resultado passando a classificação para a API da lista:
User.list(sort: "userName")
4. Operações CRUD
Quando olhamos para as operações da API,scaffolding desempenha um papel muito interessante no início; permite gerar uma API CRUD básica para uma classe de domínio, incluindo:
-
As visões necessárias
-
Ações do controlador para as operações CRUD padrão
-
Dois tipos: Dinâmico e Estático
Veja como isso funciona com andaimes dinâmicos:++
class UserController {
static scaffold = true
}
Ao escrever essa linha única, o framework gerará 7 métodos em tempo de execução: mostrar, editar, excluir, criar, salvar e atualizar. Eles serão publicados como a API para essa entidade de domínio específica.
Exemplo de andaime estático:
-
Para criar uma vista com andaime, use: “grails generate-views User“
-
Para criar o controlador e a visualização com andaime, use: “grails generate-controller User“
-
Para criar tudo em um único comando, use: “grails generate-all User“
Esses comandos geram automaticamente o encanamento necessário para esse objeto de domínio específico.
Vamos agora dar uma olhada rápida no uso dessas operações - por exemplo, para nosso objeto de domínioUser.
Paracreate new “user” record:
def user = new User(username: "test", password: "test123", email: "[email protected]", age: 14)
user.save()
Parafetch a single record:++
def user = User.get(1)
Esta APIget recuperará o objeto de domínio em um modo editável. Para um modo somente leitura, podemos usar a APIread:
def user = User.read(1)
Paraupdate existing record: `++`
def user = User.get(1)
user.userName = "testUpdate"
user.age = 20
user.save()
E uma operação de exclusão simples para um registro existente:++
def user = User.get(1)
user.delete()
5. Consultas GORM
5.1. find
Vamos começar com a APIfind:
def user = User.find("from User as u where u.username = 'test' ")
Também podemos usar uma sintaxe diferente para passar o parâmetro:
def user = User.find("from User as u where u.username?", ['test'])
Também podemos usar um parâmetro nomeado:
def user = User.find("from User as u where u.username=?", [username: 'test'])
5.2. findBy
O Grails fornece um recurso localizador dinâmico que usa propriedades de domínio para executar uma consulta em tempo de execução e retornar o primeiro registro correspondente:
def user = User.findByUsername("test")
user = User.findByUsernameAndAge("test", 20)
user = User.findByUsernameLike("tes")
user = User.findByUsernameAndAgeNotEquals("test", "100")
Você pode encontrar mais expressõeshere.
5.3. Critério
Também podemos recuperar dados usando alguns critérios flexíveis:
def user = User.find { username == "test"}
def user = User.createCriteria()
def results = user.list {
like ("userName", "te%")
and
{
between("age", 10, 20)
}
order("userName", "desc")
}
Uma observação rápida aqui - ao usar uma consulta de critério, use "\ {}" em vez de "()".
5.4. Executar consulta / atualização
O GORM também suporta a sintaxe de consulta HQL - para operações de leitura:
def user = User.executeQuery(
"select u.userName from User u where u.userName = ?", ['test'])
Bem como operações de gravação:++
def user = User.executeUpdate("delete User u where u.username =?", ['test'])
6. Conclusão
Esta foi uma introdução muito rápida ao Grails e ao GORM - para ser usada como um guia para iniciar o framework.