貓咪先來說如何修改數據庫配置。首先在機器上安裝一個MySQL數據庫,當然別的數據庫也可以。不過如果裝了Oralce和DB2,機器配置又低跑不動別找我。數據庫配置的結構已經和書上說得完全不一樣了。“grails-app\conf”下並沒有書上說的DevelopmentDataSource.groovy、TestDataSource.groovy和ProductionDataSource.groovy這三個文件。只有一個把這三個配置放到一起的DataSource.groovy。
內容如下:
//缺省的數據庫配置模板
dataSource {
pooled = false
driverClassName = "org.hsqldb.jdbcDriver"
username = "sa"
password = ""
}
//Hibernate緩存配置
hibernate {
cache.use_second_level_cache=true
cache.use_query_cache=true
cache.provider_class='org.hibernate.cache.EhCacheProvider'
}
// environment specific settings
environments {
//開發環境配置
development {
dataSource {
dbCreate = "create-drop" // one of 'create', 'create-drop','update'
url = "jdbc:hsqldb:mem:devDB"
}
}
//測試環境配置
test {
dataSource {
dbCreate = "update"
url = "jdbc:hsqldb:mem:testDb"
}
}
//生產環境配置
production {
dataSource {
dbCreate = "update"
url = "jdbc:hsqldb:file:prodDb;shutdown=true"
}
}
}
很好改的。如果要把開發數據庫換成MySQL只要把開發部分的數據庫配置改了就是了。這種配置格式,經常修改Unix下各種軟件的配置的人應該很熟悉。
首先把MySQL的數據庫驅動拷貝到lib目錄下,然後修改配置文件的開發數據庫配置。
development {
dataSource {
dbCreate = "update"
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
username = "root"
password = "****"
url = "jdbc:mysql://localhost:3306/MyMiao"
}
}
和一般的數據庫連接池的設置沒什麼不一樣的。不過“dbCreate”要注意。它有三個值:“create”(如果數據庫不存在則創建)、“create-drop”(啓動的時候建立數據庫,結束的時候銷燬數據庫)、“update”(當數據庫表和程序不一致時,修改數據庫結構)。不過我不能在MySQL數據庫上使用“create”和“create-drop”這兩個屬性。一用就出現異常。看來目前這兩個屬性只用於內嵌的HQLDB。不過MySQL倒不用建表,只要建立一個空數據庫就可以了。系統在啓動的時候,會自動在數據庫裏建立表(不能建立數據庫)。如果大家使用其他的數據庫,可以試試看能否自動建庫。如果你不想Grails對你的數據庫動手動腳,把這條去了就是了。
下面是對領域對象建立驗證和頁面的屬性顯示順序。如果驗證錯誤,是無法寫入數據庫的。
在Race類中添加下面的代碼:
static constraints ={
name(maxlength:50,blank:false)//名字最長50,不許爲Null
startDateTime(validator:{return (it>new Date())})//不能輸入過去的時間。這是自定義驗證,返回布爾值。it表示這個屬性。
city(maxLength:30,blank:false)//最長30,不能爲Null
state(inList:["BeiJing","TianJin","ShangHai","ChongQing"],blank:false)//只能輸入的值必須在四地中,不能爲Null。書上是美國的四個州。我用咱們直轄市代替了。不過目前還不能在這裏寫中文。頁面上能正確顯示,但是驗證過不去
maxRunners()
distance(min:3.1f,max:100f)//跑道長度。最小3.1最長100。(100英里,即160千米。快4個馬拉松了)
cost(min:0f,max:999.99f)//費用必須在0到999.99美元之間
}
constraints同時也決定了屬性出現在頁面上的順序。如果只是想規定某個屬性的位置但是沒有驗證,那麼直接放進去就可以了,比如maxRunners。注:這個順序是輸入頁面的順序。然後另一個對象也加入驗證。
static constraints = {
name(maxLength:50,blank:false)//最長50,不能爲Null
dateOfBirth(nullable:false)//非空
gender(inList:["M","F"])//輸入只能是兩者之一
postalAddress(maxLength:255)//最長255
emailAddress(maxLength:50,email:true)//最長50,符合Email格式
race(nullable:false)//非空
}
看記錄詳細信息的時候,“Registration : 1”之類的東西很難看吧。解決的方法就是重寫toString()方法。
Race
String toString(){"${this.name}:${this.city}:${this.state}"}
Registration
String toString(){"${this.name}:${this.emailAddress}"}
好了最初的架子就到此爲止了。大家可以多試試。