- Grails技术精解与开发实战
- 郭宏宸 王永超 贺大庆编著
- 1297字
- 2025-01-07 16:27:23
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中定义方法