会计考友 发表于 2012-8-4 12:44:44

JAVA认证:Grails与遗留数据库

Grails 对象关系映射(Grails Object Relational Mapping,GORM)API 是 Grails Web 框架的焦点部门之一。“精晓 Grails:GORM - 有趣的名称,严厉的手艺” 向您介绍了GORM 的基本常识,搜罗简单的一对多关系。之后的 “使用 Ajax 实现多对多关系” 教您使用 GORM 建模越来越复杂的类关系。此刻您将看到 GORM 的 “ORM” 若何能够矫捷措置遗留数据库中不合适 Grails 尺度命名商定的表名与列名。   备份并恢复数据
  无论什么时辰措置数据库中的现稀有据,都要有一份最新的备份。闻名的墨菲法例(Murphy's Law )的墨菲(Murphy)就像是我的守护神。什么样的错误都有可能发生,所以仍是文暌龟绸缪的好。
  备份
  除了用常规备份软件备份方针数据库外,我还建议再保留一份数据的纯文本副本。这样就能够用不异的数据集轻松地建树测试和开发数据库了,还可以轻松地跨数据库处事器移动数据(例如,在 MySQL 和 DB2 之间往返移动数据)。
  您将再一次使用本系列一向开发的 Trip Planner 应用轨范。清单 1 是一个名为 backupAirports.groovy 的 Groovy 剧本,它备份了 airport 表的记实。它用了三条语句、不足 20 行的代码毗连到了数据库,年夜表中选定了每一行,并将数据作为 XML 导出。
  清单 1. backupAirports.groovy
sql = groovy.sql.Sql.newInstance(
   "jdbc:mysql://localhost/trip?autoReconnect=true",
   "grails",
   "server",
   "com.mysql.jdbc.Driver")

x = new groovy.xml.MarkupBuilder()

x.airports{
sql.eachRow("select * from airport order by id"){ row ->
    airport(id:row.id){
      version(row.version)
      name(row.name)
      city(row.city)
      state(row.state)
      country(row.country)
      iata(row.iata)
      lat(row.lat)
      lng(row.lng)
    }
}
}   清单 1 中的第一条语句建树了一个新的 groovy.sql.Sql 对象。这是一个尺度 JDBC 类集的瘦 Groovy facade,搜罗 Connection、Statement 和 ResultSet。您可能已经认出了 newInstance 工场体例的四个参数了:JDBC 毗连字符串、用户名、密码以及 JDBC 驱动轨范(在 grails-app/conf/DataSource.groovy 中也可以找到不异值)。
  下一条语句建树了 groovy.xml.MarkupBuilder。该类许可您动态建树 XML 文档。
  最后一条语句(以 x.airports 开首)建树了 XML 树。XML 文档的根元素为 airports。它还为数据库的每一行建树了一个 airport 元素,该元素带有 id 属性。嵌套于 airport 元素的元素有 version、name 和 city 元素(想体味更多关于 Groovy Sql 和 MarkupBuilder 用途的信息,参见 参考资料)。
  清单 2 展示了由此获得的 XML:
  清单 2. 来自备份剧本的 XML 输出


    2
    Denver International Airport
    Denver
    CO
    US
    den
    39.8583188
    -104.6674674

...
...

会计考友 发表于 2012-8-4 12:44:45

JAVA认证:Grails与遗留数据库

  在备份剧本中,必然要按照主键挨次拖出记实。当恢复这个数据时,必然要按不异的挨次插入值,以确奔窃攸值同样匹配(关于这一点我将不才一小节进一步胪陈)。  注重,该剧本是完全自力于 Grails 框架的。要使用它,就必然要在您的系统上安装 Groovy(参见 参考资料,查找下载与安装声名)。此外,类路径中必然要有 JDBC 驱动轨范 JAR。可以在运行剧本时进行指定。在 UNIX&reg; 中,要输入:</p>  groovy -classpath /path/to/mysql.jar:. backupAirports.groovy   当然了,在 Windows&reg; 上,响应的文件路径和 JAR 分隔符是分歧的。在 Windows 中,则需要输入:
  groovy -classpath c:pathtomysql.jar;. backupAirports.groovy   因为我经常使用 MySQL,所以我将一份该 JAR 的副本保留在了我的主目录(在 UNIX 上为 /Users/sdavis,在 Windows 上为 c:Documents and Settingssdavis)中的 .groovy/lib 目录中。昔时夜呼吁走运行 Groovy 剧本时,该目录中的 JAR 会自动包含在类路径中。
  清单 1 中的剧本将输出写到了屏幕。要将数据保留在一个文件中,可以在运行剧本时重定向输出:
  groovy backupAirports.groovy > airports.xml   恢复数据
  年夜数据库中获掏出数据仅仅是成功了一半。还要再将数据恢复到数据库中。清单 3 中展示的 restoreAirports.groovy 剧本用 Groovy XmlParser 读入了 XML,机关了一个 SQL insert 语句,并用了一个 Groovy SQL 对象来执行该语句(要体味更多关于 XmlParser的信息,参见 参考资料)。
  清单 3. 年夜 XML 中恢复数据库记实的 Groovy 剧本
if(args.size()){
   f = new File(args)
   println f

   sql = groovy.sql.Sql.newInstance(
      "jdbc:mysql://localhost/aboutgroovy?autoReconnect=true",
      "grails",
      "server",
      "com.mysql.jdbc.Driver")

   items = new groovy.util.XmlParser().parse(f)
   items.item.each{item ->
   println "${item.@id} -- ${item.title.text()}"
      sql.execute(
         "insert into item (version, title, short_description, description,
               url, type, date_posted, posted_by) values(?,?,?,?,?,?,?,?)",
         [0, item.title.text(), item.shortDescription.text(), item.description.text(),
             item.url.text(), item.type.text(), item.datePosted.text(),
             item.postedBy.text()]
         )
   }
}
else{
   println "USAGE: itemsRestore "
}   要运行该剧本,需要输入:
  groovy restoreAirports.groovy airports.xml   切记,对于要工作的表之间的关系而言,关系的一 的方面的主键字段必然要与关系的多 的方面的外键字段相匹配。例如,储存于 airport 表的 id 列中的值必然要与 flight 表的 arrival_airline_id 列中的值不异。
  为了确保自动编号的 id 字段被恢复为不异的值,必然要在恢复表前将它们全数删除。这样就可以不才次启动 Grails 年夜头建树表时将自动编号重置为 0。
  将机场数据平安地备份之后(概略其他表中的数据也已经平安备份了),那么此刻您就可以起头试验一些新的 “遗留” 数据了。不懂么?看完下一小节您就会年夜白了。
页: [1]
查看完整版本: JAVA认证:Grails与遗留数据库