- 浏览: 33632 次
- 性别:
- 来自: 上海
文章分类
最新评论
1.开发domain和service
在出来的输入框里输入domain的名字,可以包括包名。
这里我输入test.domain.House,点finish
创建了两个groovy文件,一个当然是test.domain.House.groovy,另一个是test.domain.HouseTests.groovy.
先说test.domain.House.groovy。这个就是传说中的POGO。Grails会在运行时给他注入很多方法。
现在给他增加两个属性:
Groovy代码 收藏代码
package test.domain
class House {
String name
String address
static constraints = {
}
}
新建一个service(方法参见上一篇),名称可以直接输入House的类全名。
编辑生成的service单元测试:
Groovy代码 收藏代码
package test.domain
import grails.test.mixin.*
import org.junit.*
/**
* See the API for {@link grails.test.mixin.services.ServiceUnitTestMixin} for usage instructions
*/
@TestFor(HouseService)
@Mock(House)
class HouseServiceTests {
void testFindByAddress() {
new House(name:"Beautiful House",address:"No.1").save();
def house = service.findByAddress("No.1")
assert house != null
println house.id
}
}
注意这一行:
println house.id
之前并没有给House定义ID,GORM会默认给他加上一个ID。
另外说一下@Mock(House)。因为domain要在grails运行时才会给domain注入方法,如果在单元测试的时候可以使用Mock这个annotation,给House这个domain注入运行时的模拟方法。
实现一下service:
Groovy代码 收藏代码
package test.domain
class HouseService {
def findByAddress(String address) {
return House.findByAddress(address)
}
}
findByAddress就是一个动态生成的方法,可以让我们按地址查找。
运行一下HouseServiceTests这个单元测试:
当然也可以先debug,跑完以后会弹出打开 TESTS-TestSuites.xml 这个文件。点下面的sheet切换:
就可以看到test里打的println了:
<system-out><![CDATA[--Output from testFindByAddress--
1
]]></system-out>
这个XML的格式不解释。
service需要加事务吧:
Groovy代码 收藏代码
package test.domain
import org.springframework.transaction.annotation.Transactional;
class HouseService {
@Transactional(readOnly=true)
def findByAddress(String address) {
return House.findByAddress(address)
}
}
依然可以使用spring的@Transactional。当然也有别的方法。暂时不写了。
2.domain的验证
test.domain.HouseTests.groovy 不明白为什么要生成这个测试单元。方法都是Grails注入的,MS没什么好测的。
现在拿来做测试验证吧。
给test.domain.House.groovy加多几个属性:
Groovy代码 收藏代码
package test.domain
class House {
String name
String type
String desc
String address
Date buildedDate
Float price;
static constraints = {
type inList:["common","bungalow","villa"],nullable:true
desc maxSize:1000,nullable:true
buildedDate max:new Date(),nullable:true
price max:98765432109876543210f,scale:2,nullable:true
}
}
重点看下边的constraints。这里定义属性的约束 ,选了几个典型的。
inList,适用于枚举。
desc这种属于大文本,字符串默认在数据库里会变成 varchar(255) ,定义了最大值就会成为TEXT
bulidedDate这种属于历史时间,不应当晚于当前时间。参照这种定义方法。
price属于浮点,定义最大最小值的时候需要注意要是浮点数(注意最后的f),默认的scale是3
测试代码如下:
Groovy代码 收藏代码
package test.domain
import grails.test.mixin.*
import grails.test.mixin.domain.DomainClassUnitTestMixin;
import org.junit.*
/**
* See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions
*/
@TestFor(House)
class HouseTests {
void testSomething() {
mockForConstraintsTests(House)
def house = new House(name:"House1",type:"unknown");
assert !house.validate()
println house.errors["type"]
}
}
mockForConstraintsTests(House)是内置的给domain加上验证框架的内置方法的一个mock。house.validate()用于验证所有定义的约束,可以用在web和service里,house.errors["属性名"]可以查违反的约束。
运行测试可以看到结果。
3.domain间的关系
关于一对一,多对对,一对多,多对一的这些个关系,官方的reference写得挺清楚,不翻译了。
不过得注意一下这个belongsTo
如让房子有个主人:
Groovy代码 收藏代码
package test.domain
class House {
String name
String type
String desc
String address
Date buildedDate
Float price;
static belongsTo = [owner:Person]
static constraints = {
type inList:["common","bungalow","villa"],nullable:true
desc maxSize:1000,nullable:true
buildedDate max:new Date(),nullable:true
price max:98765432109876543210f,scale:2,nullable:true
}
}
package test.domain
Groovy代码 收藏代码
class Person {
String name
static hasMany = [houses:House]
static constraints = {
}
}
这时房子从属于人,当人删除的时候会对房子造成级联删除。有一定危险,使用的时候要注意。
由于不知道怎么在单元测试里检验下面要说的东西所以……
以下内容属于道听未经验证
4.多数据源
假设第二个数据源叫datasoruce_second,配置如下
Groovy代码 收藏代码
environments {
development {
dataSource {
dbCreate = "create-drop"
url = "jdbc:h2:mem:devDb"
}
dataSource_second {
dialect = org.hibernate.dialect.MySQLInnoDBDialect
driverClassName = 'com.mysql.jdbc.Driver'
username = 'root'
password = 'root'
url = 'jdbc:mysql://localhost/root'
dbCreate = 'update'
}
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:h2:mem:testDb"
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:prodDb"
}
dataSource_second {
dialect = org.hibernate.dialect.Oracle10gDialect
driverClassName = 'oracle.jdbc.driver.OracleDriver'
username = 'root'
password = 'root'
url = 'jdbc:oracle:thin:@localhost:1521:root'
dbCreate = 'update'
}
}
}
如果人这个表用的这个数据源:
Groovy代码 收藏代码
package test.domain
class Person {
String name
static hasMany = [houses:House]
static constraints = {
datasources(["second"])
}
}
另外还可以引入别的datasource的包,把数据源当成spring的bean注入到程序里使用。
5.直接执行SQL
一种方法当然是写java代码,然后groovy当bean来调用,这种感觉用groovy用得比较假。。。
直接写SQL的形如:
Groovy代码 收藏代码
package test.sql
import groovy.sql.Sql
class SQLTestService {
def dataSource
def sqlRun() {
def db = new Sql(dataSource)
db.eachRow('select * from house'){
println it
}
}
}
以上两节留待以后验证
发表评论
-
Grails 测试
2013-11-18 19:20 0Grails单元测试GroovySpring ... -
精通 Grails: 用 Groovy 服务器页面(GSP)改变视图
2013-11-18 19:04 1401Groovy 服务器页面(Groovy Server Page ... -
精通 Grails: 测试 Grails 应用程序
2013-11-18 18:50 466排除 bug,构建可执行文档 Grails 可以轻松确保您的应 ... -
grails中使用render方法输出XML总结
2013-11-18 18:26 758GrailsXMLJava 1.首先看看简单的XML生成情况 ... -
Grails批改默认启动端口
2013-11-18 16:04 515Grails修改默认启动端口 Grails默认启动端口号是8 ... -
iBatis查询API
2013-11-15 10:30 374“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的 ... -
Spring JDBCTemplate Query方法查询
2013-11-14 17:41 662queryspringtypessqldaoemail 近日 ... -
使用JdbcTemplate
2013-11-14 17:38 3621、使用JdbcTemplate的execute()方法执行S ... -
Oracle中查看所有表和字段
2013-11-11 17:29 306获取表字段: select * from user_tab ...
相关推荐
**Grails 2.4.2 开发框架详解** Grails是一种高效且强大的开源Web应用程序框架,它在软件开发领域中扮演着重要角色。这款框架的设计理念是提高开发者的生产力,通过简化常见的开发任务,让开发者能够专注于业务逻辑...
在本文中,我们将深入探讨如何在Grails框架中配置MongoDB数据库,并实现用户登录系统。Grails是一款基于Groovy语言的、高效的Web应用开发框架,它借鉴了Ruby on Rails的许多优秀特性。MongoDB则是一种流行的NoSQL...
**Grails 敏捷开发** Grails 是一个基于 Groovy 语言的开源Web应用框架,设计用于快速开发、高效构建动态、敏捷的Web应用程序。它借鉴了Ruby on Rails的许多优秀理念,同时提供了Java平台的强大功能和兼容性。在...
- **技术图书**:可以通过阅读 Groovy 和 Grails 相关的技术书籍加深理解。 - **国内论坛**:可以加入 Grails 的中文社区,如 `http://grails.5d6d.com` 和 `http://grails.group.javaeye.com`。 - **Groovy & ...
- **一站式解决方案**:Grails提供了一套完整的开发环境,包括构建工具、测试框架、数据库访问API等,减少了开发过程中需要处理的配置工作。 - **高度集成性**:由于Groovy运行在Java虚拟机(JVM)上,Grails能够...
《Grails企业Web应用开发与部署》 在现代软件开发领域,Grails作为一个基于Groovy语言的开源Web应用框架,以其高效、灵活和强大的特性深受开发者喜爱。它提供了丰富的插件系统,使得企业级Web应用的开发变得快速而...
Grails 默认使用内嵌的HSQLDB数据库,适用于快速开发。但在实际项目中,通常会选用更稳定的持久化解决方案,如MySQL。文章中提到的LineTest系统就选择了MySQL作为数据库。配置包括下载MySQL,添加Java驱动到Grails...
借助Groovy的动态特性,Grails能用较少的代码和配置实现常见的Web功能,如表单处理和数据库交互,极大地提高了开发效率。同时,由于Groovy运行在Java虚拟机(JVM)上,Grails应用可无缝集成Java平台,利用Java的成熟...
### Grails快速开发Web应用:知识点详解 #### Grails框架概览 Grails是一个基于Groovy语言构建的开源MVC(Model-View-Controller)Web开发框架,以其高效的开发速度和简洁的代码著称。其核心优势在于: 1. **快速...
Grails是一个基于Groovy语言的全栈Web应用开发框架,它遵循敏捷开发的理念,并且简化了基于Java的Web开发。Grails的核心是基于约定优于配置的原则,它提供了一套自动化的方式来处理项目的结构、数据持久化和Web层的...
Grails是一种基于Java平台的开源Web应用框架,它利用Groovy语言的强大特性和简洁语法,为开发者提供了一种高效、灵活的开发环境。本篇文章将深入探讨Grails开发的基础知识,帮助初学者快速掌握Grails的精髓。 1. **...
《Grails技术精解与Web开发实践11-20章》是一本专注于Grails框架的深度解析书籍,尤其适合初学者和希望提升Grails开发技能的IT从业者。Grails是一种基于Groovy语言的开源Web应用框架,它以其高效、灵活和强大的特性...
《Grails技术精解与Web开发实践2-10章》是针对Grails框架的一份珍贵资源,适合初学者及有经验的开发者深入理解并掌握Grails技术。这本书的章节涵盖了从基础到进阶的多个方面,旨在帮助读者全面了解和运用Grails进行...
在项目初始化阶段,你需要确保已经安装了Grails CLI(Command Line Interface)和相关的开发环境。 接下来,集成CAS服务需要添加相关的CAS客户端库到项目的`build.gradle`文件中。这可能包括`cas-client-core`和...
Grails是一个full-stack框架,支持从项目构建、控制器和视图的开发、以及与关系数据库之间的ORM映射,到Ajax和Java平台的无缝集成等多方面的开发工作。Grails支持的动态语言特性,使得Web应用开发变得更加简单和直观...
1. **软件的安装调试**:首先,学生需要了解如何安装Grails环境,包括Groovy SDK、Grails框架以及相关的开发工具,如IDEA或STS等集成开发环境的配置。 2. **创建项目**:在掌握基础环境后,学生将学习如何使用...
标题中提到的"Grails开发之(Rest教程)"表明本文是一份关于Grails框架下进行RESTful服务开发的教程。Grails是一个使用Groovy语言编写的高生产力的框架,其使用约定优于配置的理念,允许快速开发Web应用程序。...
2. **GORM(Grails Object Relational Mapping)**: GORM 是Grails的ORM框架,提供了与数据库交互的能力,支持关系型数据库,如MySQL、PostgreSQL等。它提供了CRUD操作,以及事务管理和动态查询。 3. **插件系统**...