`
shion
  • 浏览: 22290 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Grails的数据库相关开发

 
阅读更多

1.开发domain和service



 在出来的输入框里输入domain的名字,可以包括包名。

这里我输入test.domain.House,点finish

 

创建了两个groovy文件,一个当然是test.domain.House.groovy,另一个是test.domain.HouseTests.groovy.

先说test.domain.House.groovy。这个就是传说中的POGO。Grails会在运行时给他注入很多方法。

 

现在给他增加两个属性:

 

package test.domain

class House {
	
	String name
	String address

    static constraints = {

    }
}

 

 

新建一个service(方法参见上一篇),名称可以直接输入House的类全名。

编辑生成的service单元测试:

 

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:

 

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需要加事务吧:

 

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加多几个属性:

 

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

 

 

测试代码如下:

 

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 

如让房子有个主人:

 

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

class Person {
	
	String name
	static hasMany = [houses:House]

    static constraints = {
    }
}

 

这时房子从属于人,当人删除的时候会对房子造成级联删除。有一定危险,使用的时候要注意。

 

由于不知道怎么在单元测试里检验下面要说的东西所以……

以下内容属于道听未经验证

 

4.多数据源

假设第二个数据源叫datasoruce_second,配置如下

 

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

 

 如果人这个表用的这个数据源:

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的形如:

 

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

 

以上两节留待以后验证

  • 大小: 36.2 KB
  • 大小: 48.8 KB
  • 大小: 6.1 KB
分享到:
评论

相关推荐

    grails开发环境配置及应用开发

    详细讲解grails开发环境配置。 详细讲解grails连接mysql数据库,crud开发

    grails敏捷开发

    grails的安装,创建grails的应用程序,包括验证,数据库,控制器,groovy服务器页面,安全,插件、服务及部署的作者scott davis ,jason rudolph

    grails login

    grails 用户登录的例子,必须登录后才可以查看信息,并且只有admin用户才可以创建用户,此例子,只要将grails 的环境配好,就可以用了,用的是自带的数据库,如果需要mysql 可以更改。

    Grails权威指南.pdf

    本书详细讲解了Grails开发的全部过程,包括项目构架、控制器和视图、与关系数据库之间的ORM映射,以及与Ajax和Java平台的无缝集成。

    Grails 技术精解与Web开发实践【源码+样章】----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    Grails 技术精解与Web开发实践【源码+样章】----下载不扣分,回帖加1分,欢迎下载,童叟无欺 第1章 导论 1 1.1 RoR的革命与Web开发的新时代 1 1.2 RoR并不完美 2 1.2.1 Ruby语言方面的不足 2 1.2.2 对历史遗留项目的...

    grails 连接mysql

    这个例子实现了用grails 连接mysql 数据库,并且把内容显示出来,可以增删除改,下载这个例子后大家要把jdk tomcat grails环境搭好,然后用grails run-app来执行,也可以用其它的开发工具,本人用的是netbeans

    smig:Grails 中的简单迁移

    介绍一个简单但功能强大的 Grails 迁移插件,比标准的“Grails 数据库迁移插件”更轻量级。 这个插件让数据库的创建和更新过程在Hibernate(或多或少)熟练的手中,但有一个简单的方法来添加、更改或删除应用程序...

    grailsDemoApp:使用 GORM 的简单演示 grails 应用程序

    简单的 Grails 项目管理应用程序 #它的作用 此应用程序可让您创建、查看、编辑和删除项目。 每个项目都有 技术主管 项目经理 一个名字 一个代码 ... 开发和测试环境使用内存数据库 - 您需要自己为 p

    test-transactions:关于 JOTM 事务的 Grails 教程

    关于 JOTM 事务的 Grails 教程在本教程中,我希望能够向 Java 开发人员解释我如何将移植到 grails 应用程序。 在提供。 它可以在下的这个项目中找到。 这就是正在实现的目标,目前我还没有将它分布在多个数据库上,...

    s2oauth:Spring Security Oauth Grails 3插件

    s2oauth 适用于Grails 3的POC Spring Security + OAuth插件 Grails 2插件的主要区别: 不再依赖但该插件的一些代码已移植到此目前(没有)域类和数据库持久性最简单的代码储存库结构为了加快开发速度,有一个单独的...

    openthesaurus:基于网络的词库搜索和管理

    开放词库OpenThesaurus,一个... 对于开发,您的数据库需要在grails-app/conf/application.yml 。 在开发模式下使用grails run-app直接启动 web 应用程序。 然后它可以在http://localhost:8080/ 。 使用grails war构

    DocumentViewer:文档查看器演示,使用 Grails 2.4.3 和 Angular JS

    该项目使用 Grails 2.4.4 和 Java 7 — MySQL 是一个可选组件,目前仅在生产环境中启用。 该应用程序具有以下可配置选项: demo.bootstrapData(默认为 false)。 如果启用,它将为开发以外的环境创建引导程序...

    etmvc + Easyui

    etmvc + Easyui +oracle 开发实例,带数据库,内有treegrid,tree,data等案例。可供java,jsp,Easyui, etmvc学习研究。[etmvc是基于Java技术,为WEB开发提供的一套简易MVC框架。 简易但不简单,其设计和实现借鉴业界...

    Spring Boot实战 ,丁雪丰 (译者) 中文版

    6.3.3 开发Grails控制器 104 6.3.4 创建视图 105 6.4 小结 107 第7章 深入Actuator 108 7.1 揭秘Actuator的端点 108 7.1.1 查看配置明细 109 7.1.2 运行时度量 115 7.1.3 关闭应用程序 121 ...

    spring boot实战.pdf高清无水印

    6.3.3 开发Grails控制器 104 6.3.4 创建视图 105 6.4 小结 107 第7章 深入Actuator 108 7.1 揭秘Actuator的端点 108 7.1.1 查看配置明细 109 7.1.2 运行时度量 115 7.1.3 关闭应用程序 121 7.1.4 ...

    GrailsCommerceSampleProject:GrailsCommerce 项目示例

    你需要什么为了使用这个平台,你需要: 一个数据库税务云ID 支付特权(Authorize.net 或 2Checkout 目前均受支持) 为了使用这个平台,你需要: Grails 应用程序(版本 2.x) 一个数据库USPS 运输 API 帐户一个...

    jurassic-park

    #h1 jurassic-park此应用程序已开发为SpringBoot应用程序。 该应用程序的要求是 Grails-2.4.5 MySQL的 #h3数据库配置数据库配置可用于在'jurassic-park / grais-app / conf / config.groovy'文件中进行修改 在该...

    java前后端分离源码-yalla-challenge:yalla-挑战

    java前公开源码全栈开发人员分配 焦点 此作业旨在测试以下内容: 学习新事物的能力 阅读/理解文档的能力 从头到尾看透某事的能力 前端技能 后端技能 源代码管理 常识 工作质量 代码风格 理解代码分离的关注点 网址...

    cf-docker-broker:一个 CloudFoundry 服务代理,用于在 Docker 容器中运行自定义服务,可选择在 CoreOS(在 Google Compute Engine 和 AWS 上)

    CloudFoundry 的 Docker 服务代理这是一个 Grails/Groovy 应用程序原型 Docker 作为容器服务,以允许快速 CloudFoundry 服务开发和部署。 CloudFoundry 是一个弹性运行时,根据其定义,它不提供数据库等服务,而是仅...

    gokb

    先前的资料库GOKb开发已从移至此处在Grails交互模式下运行GOKb依存关系清理Postgres数据库运行Elasticsearch集群(索引将自动创建)配置通过将application-development.yml (例如template_files/的示例)放置在gokb...

Global site tag (gtag.js) - Google Analytics