Contents

Grails 3和Gorm的简介

1.概述

这是对 Grails 3 和 GORM 的快速介绍。 我们当然会使用 Groovy,并且——隐含地——该框架还使用 Hibernate 来实现 ORM,Spring 框架用于依赖注入,SiteMash 用于布局和主题等。

2.数据源配置

我们无需指定任何显式数据源配置即可开始——默认情况下,Grails 使用 HSQLDB 数据库作为开发和测试环境。 但是如果你想改变这些默认值,你可以在application.yml中定义你选择的数据源:

environments:
    development:
        dataSource:
             driverClassName : "com.mysql.jdbc.Driver"
             url : "jdbc:mysql://localhost:8080/test"
             dialect : org.hibernate.dialect.MySQL5InnoDBDialect

同样,我们可以在这里创建多个环境,如果需要,可以在development旁边。

3. Domain

Grails 能够基于数据库配置中的dbCreate属性为我们的域类创建数据库结构。 让我们在这里定义这些域类之一:

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
    }
}

请注意我们如何在模型中指定我们的验证约束,这使事情变得干净整洁,并且没有注释。 当实体被持久化时,这些约束将由 Grails 自动检查,如果这些约束中的任何一个被破坏,框架将抛出适当的验证异常。 我们还可以在模型的mapping属性中指定 GORM 映射:

static mapping = { sort "userName" }

现在,如果我们调用User.list() - 我们将返回按** User排序**的结果。 我们当然可以通过将排序传递给列表 API 来实现相同的结果:

User.list(sort: "userName")

4. CRUD 操作

当我们看 API 操作时,脚手架在开始时扮演着非常有趣的角色;它允许您为域类生成基本的 CRUD API,包括:

  • 必要的视图
  • 标准 CRUD 操作的控制器操作
  • 两种类型:动态和静态 以下是动态脚手架的工作原理:
class UserController {
    static scaffold = true
}

只需编写这一行代码,框架就会在运行时生成 7 个方法:show、edit、delete、create、save和update。这些将作为该特定域实体的 API 发布。

静态脚手架示例:

  • 使用脚手架创建视图:grails generate-views User
  • 使用脚手架创建控制器和视图:grails generate-controller User
  • 要在一个命令中创建所有内容,请使用:grails generate-all User 这些命令将为该特定域对象自动生成必要的方法。 现在让我们快速了解如何使用这些操作——例如,对于我们的User域对象。 创建新的User记录:
def user = new User(username: "test", password: "test123", email: "[[email protected]](/cdn_cgi/l/email_protection)", age: 14)
user.save()

获取单个记录

def user = User.get(1)

getAPI 将以可编辑域对象。对于只读模式,我们可以使用read API:

def user = User.read(1)

更新现有记录

def user = User.get(1)
user.userName = "testUpdate"
user.age = 20
user.save()

以及对现有记录的简单删除操作:

def user = User.get(1)
user.delete()

5. GORM 查询

5.1. find

让我们从find API 开始:

def user = User.find("from User as u where u.username = 'test' ")

我们还可以使用不同的语法来传递参数:

def user = User.find("from User as u where u.username?", ['test'])

我们还可以使用命名参数:

def user = User.find("from User as u where u.username=?", [username: 'test'])

5.2. findBy

Grails 提供了一个动态查找工具,它使用域属性在运行时执行查询并返回第一个匹配记录:

def user = User.findByUsername("test")
user = User.findByUsernameAndAge("test", 20)
user = User.findByUsernameLike("tes")
user = User.findByUsernameAndAgeNotEquals("test", "100")

你可以在这里 找到更多的表达方式。

5.3. Criteria

我们还可以使用一些灵活的标准检索数据:

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")
}

这里有一个快速说明——当使用条件查询时,使用“{}”而不是“()”。

5.4. 执行Query/Update

GORM 还支持 HQL 查询语法——用于读取操作:

def user = User.executeQuery(
  "select u.userName from User u where u.userName = ?", ['test'])

以及写操作:

def user = User.executeUpdate("delete User u where u.username =?", ['test'])