使用ANT自动进行数据库的相关操作的方法

使用ANT自动进行数据库的相关操作的方法

如何使用ANT自动进行数据库的相关操作

赵才文(vipcowrie@sina.com)版权所有

如今的系统,无论是基于CS的还是基于BS的架构,如果与数据库打交道,那么程序员在开发系统的时候,或者在进行单元测试的时候,经常要对数据库进行一些重复的操作,例如初始化,建库,删除表格,插入测试数据等等。每次要做测试的时候,因为要求环境为最基本、最初始的环境,所以程序员必须手动的重复的执行某些sql语句,使得我们程序员的工作效率十分的低下。

ANT,是apache组织推出的基于java的构建工具,非常象C世界里面的MAKE工具,只要你写好构建程序的教本,就好比是戏剧的剧本一样,它会自动的按照你的要求去编译,运行、发布等等。

ANT的下载地址是:http://ant.apache.org

ANT基本上是由一个一个的TARGET(任务)构成的,你可以在一个Project内部建立NTARGET,并且每个TARGET可以独立也可以依存于(depends)其他的任务,也就是说,只有其他的任务完成的时候,这个任务才有可能执行。

ANT里面有许多内置的task,这些task可以用来构建target,比如,你要完成一个编译的任务,那么你就可以引用这个taskjavac,看上去象是java内部的命令,其实ant对他进行了封装。例如:

 <javac srcdir="${src}"
 destdir="${build}"
 classpath="xyz.jar"
 debug="on"

/>

这个任务将会编译src里面所有的源代码到目标文件夹build,使用的classpathxyz.jar,并且是debug模式的。

ANT里面还有一个非常有用的task就是与数据库操作相关的一个tasksql,它的原理如下:

通过JDBC执行一系列的sql语句,语句可以从文本文件中读取,也可以通过包含的方式放在任务中。语句之间的间隔使用的是“;”或者自己定义的分割符号。注释的语句使用的是REM或者“――”。可以使用autocommit属性来控制语句是否真的被提交,还可以使用onerror属性来控制当执行的过程中遇到错误的时候应该怎么办?(abortcontinuestop)。

它有下列属性:

Attribute

Description

Required

driver

Class name of the jdbc driver

Yes

url

Database connection url

Yes

userid

Database user name

Yes

password

Database password

Yes

src

File containing SQL statements

Yes, unless statements enclosed within tags

encoding

The encoding of the files containing SQL statements

No - defaults to default JVM encoding

delimiter

String that separates SQL statements

No, default ";"

autocommit

Auto commit flag for database connection (default false)

No, default "false"

print

Print result sets from the statements (default false)

No, default "false"

showheaders

Print headers for result sets from the statements (default true)

No, default "true"

output

Output file for result sets (defaults to System.out)

No (print to System.out by default)

append

whether output should be appended to or overwrite an existing file. Defaults to false.

No

classpath

Classpath used to load driver

No (use system classpath)

classpathref

The classpath to use, given as a reference to a path defined elsewhere.

No (use system classpath)

onerror

Action to perform when statement fails: continue, stop, abort

No, default "abort"

rdbms

Execute task only if this rdbms

No (no restriction)

version

Execute task only if rdbms version match

No (no restriction)

caching

Should the task cache loaders and the driver?

No (default=true)

例子:

假如,我们有一个任务,就是每次程序运行的时候我们都要初始化整个数据库。要执行的sql语句如下:

drop table CHILD;

drop table TOY;

create table CHILD (id number,name varchar(200));

create table TOY(t_id number, c_id number,description varchar(200));

insert into child values(1,”tom”);

insert into toy values(1,1,”a baby”);

我们把上述语句存为一个文件叫ddl.sql,然后建立ant教本如下:

<project name=”test” basedir=”.”>

<target name=”dbinit”>

<echo message="create database schema...If error occurs,let it be" />

<sql

driver="oracle.jdbc.driver.OracleDriver"

url="jdbc:oracle:thin:@localhost:test"

userid="test"

password="test"

classpathref="classes12.jar"

src="${ddl.sql}"

onerror="continue"

/>

</target>

</project>

这样,我们已经建立好了ant的教本,把它另外存储为build.xml,在命令行方式下面,运行下面的命令:

ant dbinit

结果如下:

dbinit:

[echo] create database schema...If error occurs,let it be

[sql] Executing file: D:/jbproject/test/db/ddl.sql

[sql] 6 of 6 SQL statements executed successfully

BUILD SUCCESSFUL

这样我们每次的工作就减少了很多了。