貓學Grails之完善編寫的第一個程序和數據庫設置

  在上一篇中程序已經基本成型了。但是還有很多地方需要完善。Grails的缺省設置是一個HQLDB的內存數據庫。每次啓動時建立,關閉時銷燬,不能保留下來。而且輸入數據的校驗目前還只侷限在是否爲Null。
  貓咪先來說如何修改數據庫配置。首先在機器上安裝一個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}"} 


  好了最初的架子就到此爲止了。大家可以多試試。

 

發佈了10 篇原創文章 · 獲贊 0 · 訪問量 1778
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章