貓學Grails之完善編寫的第一個程式和資料庫設定

wlmouse發表於2008-01-25
  在上一篇中程式已經基本成型了。但是還有很多地方需要完善。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"
  }
 }
}
<p class="indent">

  很好改的。如果要把開發資料庫換成MySQL只要把開發部分的資料庫配置改了就是了。這種配置格式,經常修改Unix下各種軟體的配置的人應該很熟悉。
  首先把MySQL的資料庫驅動複製到lib目錄下,然後修改配置檔案的開發資料庫配置。

development {
  dataSource {
   dbCreate = "update"
   pooled = true
   driverClassName = "com.mysql.jdbc.Driver"
   username = "root"
   password = "****"
   url = "jdbc:mysql://localhost:3306/MyMiao"
  }
 }
<p class="indent">

  和一般的資料庫連線池的設定沒什麼不一樣的。不過“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美元之間
    }
<p class="indent">

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}"}
<p class="indent">

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

相關文章