当前位置: 首页 > 图文教程 > 认证考试 > java认证 > Grails与遗留数据库

java认证
利用DES加密的算法保护Java源代码
有效使用final关键字的准则
Java基础:深入认识this的使用
高效编写JAVA代码的15条建议
剖析Java对象转为String的几种常用方法
在Java中轻松实现界面跳转
高手告诉你Java学习的捷径
浅析Java中Data类的实际应用
如何突破Java异常处理规则
String.getBytes()方法中的中文编码问题
Java将应用程序的设定存在哪里
小议学习java的浮躁心态
如何迅速获取Java认证?
一道SCJP考题,要考SCJP的不能不看
SCWCD考试大纲中各部分的题量分布
JAVA使用内部类和匿名类优化代码
如何在Java的应用过程中来获取系统属性
属性配置文件的使用方法
java的“别名”以及clone机制
用Java简单实现文件分割与合并的事例

java认证 中的 Grails与遗留数据库


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-04   浏览: 546 ::
收藏到网摘: n/a

  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 输出

<airports>
  
<airport id='1'>
    <version>2</version>
    
<name>Denver International Airport</name>
    
<city>Denver</city>
    
<state>CO</state>
    
<country>US</country>
    
<iata>den</iata>
    
<lat>39.8583188</lat>
    
<lng>-104.6674674</lng>
  
</airport>
  
<airport id='2'>...</airport>
  <airport id='3'>...</airport>
</airports>

  在备份脚本中,一定要按照主键顺序拖出记录。当恢复这个数据时,一定要按相同的顺序插入值,以确保外键值同样匹配(关于这一点我将在下一小节进一步详述)。

  注意,该脚本是完全独立于 Grails 框架的。要使用它,就一定要在您的系统上安装 Groovy(参见 参考资料,查找下载与安装说明)。另外,类路径中一定要有 JDBC 驱动程序 JAR。可以在运行脚本时进行指定。在 UNIX® 中,要输入:

  groovy -classpath /path/to/mysql.jar:. backupAirports.groovy

  当然了,在 Windows® 上,相应的文件路径和 JAR 分隔符是不同的。在 Windows 中,则需要输入:

  groovy -classpath c:\path\to\mysql.jar;. backupAirports.groovy

  由于我经常使用 MySQL,所以我将一份该 JAR 的副本保存在了我的主目录(在 UNIX 上为 /Users/sdavis,在 Windows 上为 c:\Documents and Settings\sdavis)中的 .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[0])
   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 [filename]"
}

  要运行该脚本,需要输入:

  groovy restoreAirports.groovy airports.xml

  切记,对于要工作的表之间的关系而言,关系的一 的方面的主键字段一定要与关系的多 的方面的外键字段相匹配。例如,储存于 airport 表的 id 列中的值一定要与 flight 表的 arrival_airline_id 列中的值相同。

  为了确保自动编号的 id 字段被恢复为相同的值,一定要在恢复表前将它们全部删除。这样就可以在下次启动 Grails 重新创建表时将自动编号重置为 0。

  将机场数据安全地备份之后(大概其他表中的数据也已经安全备份了),那么现在您就可以开始试验一些新的 “遗留” 数据了。不懂么?看完下一小节您就会明白了。