a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 239|回复: 1

[专业语言] JAVA认证:Grails与遗留数据库

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Grails 对象关系映射(Grails Object Relational Mapping,GORM)API 是 Grails Web 框架的焦点部门之一。“精晓 Grails:GORM - 有趣的名称,严厉的手艺” 向您介绍了GORM 的基本常识,搜罗简单的一对多关系。之后的 “使用 Ajax 实现多对多关系” 教您使用 GORM 建模越来越复杂的类关系。此刻您将看到 GORM 的 “ORM” 若何能够矫捷措置遗留数据库中不合适 Grails 尺度命名商定的表名与列名。   备份并恢复数据$ h9 b) m9 ]) Z: {
  无论什么时辰措置数据库中的现稀有据,都要有一份最新的备份。闻名的墨菲法例(Murphy's Law )的墨菲(Murphy)就像是我的守护神。什么样的错误都有可能发生,所以仍是文暌龟绸缪的好。: D0 c$ z% s& I# I; M0 V
  备份
0 `% a* q1 h* e: Q8 i  除了用常规备份软件备份方针数据库外,我还建议再保留一份数据的纯文本副本。这样就能够用不异的数据集轻松地建树测试和开发数据库了,还可以轻松地跨数据库处事器移动数据(例如,在 MySQL 和 DB2 之间往返移动数据)。
/ E2 v6 a: k% u3 l  您将再一次使用本系列一向开发的 Trip Planner 应用轨范。清单 1 是一个名为 backupAirports.groovy 的 Groovy 剧本,它备份了 airport 表的记实。它用了三条语句、不足 20 行的代码毗连到了数据库,年夜表中选定了每一行,并将数据作为 XML 导出。6 z! V- J% D% T5 o4 f4 D* o5 `8 ], U
  清单 1. backupAirports.groovy
/ j4 C, p) X# m1 \+ a* `sql = groovy.sql.Sql.newInstance(, Q  ?, n9 L2 H4 `
   "jdbc:mysql://localhost/trip?autoReconnect=true",3 V$ @5 ^! ^' g4 C+ ^
   "grails",) o7 D( Z( F. N7 I2 k' p. ~
   "server",
$ t0 m3 N) L+ v1 n% o. |   "com.mysql.jdbc.Driver")6 e7 a+ f8 N! U8 B" c8 V
( I8 `) ?0 I: c: e7 o
x = new groovy.xml.MarkupBuilder(). d) j# H( A8 t) }: c
0 ^3 A4 }4 F; H( e4 g& m4 N- Q+ y
x.airports{
( `4 p4 u. H1 G  sql.eachRow("select * from airport order by id"){ row ->
* a" |, B& M4 q3 g    airport(id:row.id){
% ?/ r0 p( X" r& h6 ?      version(row.version)* O) r" B* j  `7 E& F. _( S! C
      name(row.name)8 Z& B2 h1 t6 K  U( Z- M0 d+ \- u
      city(row.city)
, }, }6 ?' |* H& Y: t, ]- p      state(row.state)3 Z( l* Z6 I- [) p# \$ P. L
      country(row.country)' b4 L2 N. K6 E! R8 Y4 D" n
      iata(row.iata)
! m, W8 T% ^& \. L$ |      lat(row.lat)' y# \7 @3 H5 D3 B- @' P/ O( B0 W  i
      lng(row.lng). l7 x  O! W' y
    }
7 N+ X, I/ r' {  a1 `! r" V  }
# h# ]) T6 E# D, t. v6 J}   清单 1 中的第一条语句建树了一个新的 groovy.sql.Sql 对象。这是一个尺度 JDBC 类集的瘦 Groovy facade,搜罗 Connection、Statement 和 ResultSet。您可能已经认出了 newInstance 工场体例的四个参数了:JDBC 毗连字符串、用户名、密码以及 JDBC 驱动轨范(在 grails-app/conf/DataSource.groovy 中也可以找到不异值)。
2 x; |& C$ f8 G$ s1 O' V  下一条语句建树了 groovy.xml.MarkupBuilder。该类许可您动态建树 XML 文档。
# P' P, G; n# `  最后一条语句(以 x.airports 开首)建树了 XML 树。XML 文档的根元素为 airports。它还为数据库的每一行建树了一个 airport 元素,该元素带有 id 属性。嵌套于 airport 元素的元素有 version、name 和 city 元素(想体味更多关于 Groovy Sql 和 MarkupBuilder 用途的信息,参见 参考资料)。: i' s1 J6 X+ |* i" ?
  清单 2 展示了由此获得的 XML:+ G2 P3 m9 B2 J5 R0 q- Z- W
  清单 2. 来自备份剧本的 XML 输出7 n' u8 C% h3 ^+ ^7 w/ L

4 x2 O6 L) F0 T# U  Q5 [2 }  
1 @4 z6 r" D# V$ Q    2! N/ Z% ^0 U, e5 j( \8 x1 ?2 ^- k
    Denver International Airport
3 x# z! D% C* z( [: W/ K* _2 d- B; C    Denver
4 P/ l. l. u5 [5 k    CO
5 \/ a- A3 i4 P! T5 k; z    US
% M1 z0 v; S9 G# A$ d: D    den
) h+ m+ p' O9 ^    39.8583188
/ f3 ?3 e2 k! {. `9 y8 U. M1 u- d    -104.6674674; W, Z4 Y& U* w+ A0 d# o9 i
  . V1 b. j' f0 B6 w3 p
  ...
* f: v# B! q+ W, X* B  ...
回复

使用道具 举报

 楼主| 发表于 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 中,则需要输入:5 @1 j1 g8 t; {2 B( A# @& T
  groovy -classpath c:pathtomysql.jar;. backupAirports.groovy   因为我经常使用 MySQL,所以我将一份该 JAR 的副本保留在了我的主目录(在 UNIX 上为 /Users/sdavis,在 Windows 上为 c:Documents and Settingssdavis)中的 .groovy/lib 目录中。昔时夜呼吁走运行 Groovy 剧本时,该目录中的 JAR 会自动包含在类路径中。
! f- c( c- _! r  清单 1 中的剧本将输出写到了屏幕。要将数据保留在一个文件中,可以在运行剧本时重定向输出:
2 h- P0 a6 t! C! I  groovy backupAirports.groovy > airports.xml   恢复数据
8 H! F% n3 B$ v  年夜数据库中获掏出数据仅仅是成功了一半。还要再将数据恢复到数据库中。清单 3 中展示的 restoreAirports.groovy 剧本用 Groovy XmlParser 读入了 XML,机关了一个 SQL insert 语句,并用了一个 Groovy SQL 对象来执行该语句(要体味更多关于 XmlParser的信息,参见 参考资料)。
# D" i! ~7 x3 x+ m! U; \! V, \  j  清单 3. 年夜 XML 中恢复数据库记实的 Groovy 剧本) L! L# }) k& C% ~6 ]7 W& L3 g
if(args.size()){' k  a* i2 F7 Y) G5 ~
   f = new File(args[0])
; u# `: }" o- ^! s3 K1 I   println f# J  g" Q; E! s5 W
5 ~) i3 B3 i; ?( F1 C# }
   sql = groovy.sql.Sql.newInstance(+ ?9 j: P7 N. Y
      "jdbc:mysql://localhost/aboutgroovy?autoReconnect=true",, o: u& _6 r% ^4 B9 K
      "grails",
# w8 Y2 S, P5 v( ?- t3 ~      "server",
1 D' X, u8 R2 ^* W' Y      "com.mysql.jdbc.Driver")$ _( l. k. ^2 d6 h& L

1 d4 m6 u- K! D- E( T   items = new groovy.util.XmlParser().parse(f)) M2 Z+ Y% a/ G6 ?# H& v
   items.item.each{item ->
. r9 G% _9 G, e: D+ {$ M     println "${item.@id} -- ${item.title.text()}"
6 {* {2 ]  _0 b4 X; k$ a% h1 B) _      sql.execute(% a5 d; F  u4 A$ F; {9 q
         "insert into item (version, title, short_description, description,
' Y- J/ n! P0 ^6 b( [9 b* G2 U                 url, type, date_posted, posted_by) values(?,?,?,?,?,?,?,?)",! ~' s9 y8 L3 s. P' M+ P' I
         [0, item.title.text(), item.shortDescription.text(), item.description.text(), 4 c7 X% |' T- @; m# n
             item.url.text(), item.type.text(), item.datePosted.text(), - y. Q. N. ~6 t6 j
             item.postedBy.text()]
9 v7 V) f' v7 w7 |         )* V& n" h9 Z' P5 T+ f
   }& c: ^" l# [4 r( ^* U
}/ S4 L) y8 z# I, [# P! [! `
else{
- ?3 {$ V# p% i" P   println "USAGE: itemsRestore [filename]"
# U0 g, ?) L' o) S4 ~}   要运行该剧本,需要输入:& u' o: c) }- A+ \" I% q
  groovy restoreAirports.groovy airports.xml   切记,对于要工作的表之间的关系而言,关系的一 的方面的主键字段必然要与关系的多 的方面的外键字段相匹配。例如,储存于 airport 表的 id 列中的值必然要与 flight 表的 arrival_airline_id 列中的值不异。; s6 g6 A/ D+ C! {* s1 _" b
  为了确保自动编号的 id 字段被恢复为不异的值,必然要在恢复表前将它们全数删除。这样就可以不才次启动 Grails 年夜头建树表时将自动编号重置为 0。
& e- V3 _( H; W* C. N* M  将机场数据平安地备份之后(概略其他表中的数据也已经平安备份了),那么此刻您就可以起头试验一些新的 “遗留” 数据了。不懂么?看完下一小节您就会年夜白了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-29 16:37 , Processed in 0.150184 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表