Ajax与GORM开发全解析
立即解锁
发布时间: 2025-08-16 01:06:24 阅读量: 6 订阅数: 17 


Grails 2权威指南:从入门到精通
### Ajax与GORM开发全解析
#### 1. Ajax性能考量
在应用程序中使用Ajax时,其对性能的影响不容忽视。设计不佳的Ajax应用程序往往会产生大量请求,这是因为会渲染许多小段代码。此前的Ajax开发方式较为简单,未充分考虑性能问题。
不过,现在采取措施还为时不晚。在增加硬件投入之前,可以采用以下技术减少Ajax应用程序的请求数量:
- **数据传输对象(DTO)模式**:将多个操作批量处理为一次调用,并向服务器传递足够的状态信息,以便一次性执行多个操作。例如,一次传输大量信息的调用比多次小调用更高效。
- **将更多复杂性转移到客户端**:由于Ajax客户端通常位于单个物理页面上,可通过缓存将大量状态信息保留在客户端。缓存是Ajax开发中最重要的技术之一,应尽可能利用它来优化与服务器的通信。
采用这些技术不仅能提升服务器性能,让服务器基础设施团队满意,还能为应用程序用户带来更快的响应时间和更好的交互体验。
#### 2. GORM基础操作
GORM在持久化层起着关键作用,下面介绍其基本的持久化操作。
##### 2.1 读取对象
每个域类都自动具备一些查询域实例的方法:
- **get方法**:通过域类的标识符获取实例,若数据库中不存在则返回null。示例代码如下:
```groovy
class AlbumController {
def show() {
def album = Album.get(params.id)
if(album) {
}
}
}
```
- **getAll方法**:可接受多个标识符,返回实例列表。可以使用列表或可变参数指定标识符,例如:
```groovy
def albums = Album.getAll(1,2,3)
```
- **read方法**:以只读状态加载对象,对返回的对象所做的更改不会持久化到数据库,同时还能带来性能提升,因为Hibernate无需进行脏检查。示例:
```groovy
def album = Album.read(params.id)
```
##### 2.2 列表、排序和计数
- **list方法**:用于从数据库中检索项目,可接受多个命名参数来定制结果,参数定义如下:
- **max**:返回的最大实例数。
- **offset**:第一个结果相对于0的偏移量。
- **sort**:用于排序的属性名。
- **order**:结果的排序顺序,`asc` 表示升序,`desc` 表示降序。
示例代码:
```groovy
// 获取所有专辑
def allAlbums = Album.list()
// 获取最近创建的十个专辑
def topTen = Album.list(max:10, sort:'dateCreated', order:'desc')
// 获取专辑总数
def totalAlbums = Album.count()
```
- **listOrderBy*方法**:是 `list` 方法的变体,使用类本身的属性进行方法签名。例如,通过调用 `listOrderByDateCreated()` 方法可按创建日期对所有 `Album` 实例进行排序:
```groovy
def allByDate = Album.listOrderByDateCreated()
```
##### 2.3 保存、更新和删除
- **保存**:调用 `save()` 方法可将对象持久化到数据库。示例:
```groovy
def album = new Album(params)
album.save()
```
- **更新**:对现有持久化实例调用 `save()` 方法即可更新对象。Hibernate会自动判断是执行SQL INSERT还是UPDATE操作,但在某些旧数据库中可能会判断错误,此时可通过传递 `insert:true` 参数来解决。示例:
```groovy
def album = Album.get(1)
album.title = "The Changed Title"
album.save()
// 解决Hibernate判断错误的情况
album.save(insert:true)
```
- **删除**:使用 `delete()` 方法删除对象:
```groovy
album.delete()
```
#### 3. GORM关联操作
GORM支持多种关联方式,下面详细介绍。
##### 3.1 关联排序
在典型的一对多关联中,如 `Album` 类的 `songs` 属性,默认类型为 `java.util.Set`,不允许重复且无顺序。若需要特定顺序,可采用以下方法:
- **使用SortedSet**:需要为放入 `SortedSet` 的每个项实现 `Comparable` 接口。示例代码:
```groovy
class Album {
...
SortedSet songs
}
class Song implements Comparable {
...
int compareTo(o) {
if(this.trackNumber > o.trackNumber) {
return 1
} else if(this.trackNumber < o.trackNumber) {
return -1
}
return 0
}
}
```
- **声明式指定排序顺序**:使用 `mapping` 属性。例如,对所有查询按曲目编号对 `Song` 实例进行排序:
```groovy
class Song {
...
static mapping = {
sort "trackNumbe
```
0
0
复制全文
相关推荐










