1.3.4 创建模型

模型,即框架中的Domain,它反映数据库结构与字段设置,是软件的业务概念模型,在使用时需要安装和配置数据库。数据库的配置在grails-app/conf/application.yml文件中的dataSource节点下。新创建项目的数据源默认使用H2数据库,可以通过更改相关配置切换到MySQL或者其他类型数据库。此处我们使用默认配置。

配置好数据库后便可以开始创建模型。在任何一个应用系统中,数据模型都是最基本的构成,是对业务的描述和表达,创建模型也是项目搭建过程中需要首先完成的工作。代码1.8为通过命令行创建Person模型。

# 进入项目所在目录
$ cd ~/ grailsProjects/intro
# 创建名为Person的Domain类
# 自动创建出Person.groovy和测试文件PersonSpec.groovy
$ grails create -domain -class Person
| Created grails -app/domain/intro/Person.groovy
| Created src/test/groovy/intro/PersonSpec.groovy

代码1.8 创建Person模型

我们创建了一个Person模型,或者说创建了一个名称为Person的数据表,Person模型中的属性即Person数据表的属性字段。在这个类中,我们添加firstName、lastName等人员属性,更改Person.groovy文件,如代码1.9所示。

package intro
class Person {
    String firstName         // 名字
    String lastName          // 姓氏
    String gender            // 性别
    Integer age              // 年龄
    Boolean active = false   // 设置默认值为false

    static constraints = {
        firstName nullable: true , maxSize : 32
        lastName nullable: true , maxSize : 32
        gender nullable: true , inList: ['male', 'female']
        age nullable: true
        active nullable: true
    }
}

代码1.9 编写Person模型

在添加的内容中,对每个属性做了一些约束的设置,比如设置默认值是否为空(nullable),字段大小(maxSize)以及字段值(inList)的选择。我们在添加属性的时候应该尽量避免使用基本数据类型(int、boolean等),而应该优先使用封装的数据类型(Integer、Boolean等)。

Domain类的定义过程和Java框架相比,省去了很多重复性的工作,比如定义getting()和setting()方法,以及拆箱和装箱操作。运行过程中Groovy会根据使用情况来判断并完成这些基础操作。

模型创建完成后启动项目,可以通过访问http://localhost:8080/dbconsole来查看数据库的内容。其中在JDBC URL处填写的内容与conf/application.yml文件中的development.dataSource配置保持一致,默认为jdbc:h2:mem:devDb;MVCC=TRUE。

进入数据库控制台后可以在左侧看到新创建的Person表,以及我们设置的每个字段,也可通过grails schema-export命令导出数据库结构。

在Domain文件中,我们可以为每个字段添加约束条件,如代码1.9中闭包constraints所示。约束条件为数据持久化过程校验规则,常见的约束条件有email、url、max、min等,想了解更多约束条件可以查看官方文档。同时我们也可以用validator的形式来创建自定义约束条件,对数据字段进行特定的限制。

Grails提供grails console命令对项目进行快速调试。项目启动后,在项目目录下调用grails console命令打开运行时控制台,如代码1.10所示。在控制台窗口中可以运行Groovy代码来进行调试。

# 进入项目所在目录
$ cd ~/ grailsProjects/intro
# 运行grails console命令
$ grails console
Using grails version 3.3.5 in this shell.
| Running console...

代码1.10 开启grails console控制台

在grails console交互界面,可以使用代码1.11中的操作测试约束条件的效果。调用save()方法保存数据时进行规则校验,验证的结果会以列表的形式返回,后面章节会对错误处理进行详细介绍。

import intro.*
def person = new Person()
person.gender = 'man'
// 可以调用validate()方法进行约束的主动验证
// 在调用save()方法持久化到数据库时,会自动调用validate()方法进行验证
println person.validate() // false,验证未通过,因为'man'不在['male','female']中
person.gender = 'male'
println person.validate() // true,验证通过

代码1.11 在grails console中进行约束条件测试

我们可以在Domain类中添加自定义的方法进行定制,比如编写toString()方法,覆盖默认的toString()实现,其他的类方法也可以进行定制实现,如代码1.12所示。需要注意Grails框架不会动态加载Domain的更改,因为涉及对应数据库的更新,所以修改后需重新启动项目才能生效。

String toString() {
    firstName + " " + lastName // 方法的最后一句执行结果即为该方法的返回值
    // return firstName + " " + lastName // 与上句等同效果
}

代码1.12 在Domain中定义方法