使用ANT自动进行数据库的相关操作的方法
使用ANT自动进行数据库的相关操作的方法
如何使用ANT自动进行数据库的相关操作
赵才文(vipcowrie@sina.com)版权所有
如今的系统,无论是基于CS的还是基于BS的架构,如果与数据库打交道,那么程序员在开发系统的时候,或者在进行单元测试的时候,经常要对数据库进行一些重复的操作,例如初始化,建库,删除表格,插入测试数据等等。每次要做测试的时候,因为要求环境为最基本、最初始的环境,所以程序员必须手动的重复的执行某些sql语句,使得我们程序员的工作效率十分的低下。
ANT,是apache组织推出的基于java的构建工具,非常象C世界里面的MAKE工具,只要你写好构建程序的教本,就好比是戏剧的剧本一样,它会自动的按照你的要求去编译,运行、发布等等。
ANT的下载地址是:http://ant.apache.org
ANT基本上是由一个一个的TARGET(任务)构成的,你可以在一个Project内部建立N个TARGET,并且每个TARGET可以独立也可以依存于(depends)其他的任务,也就是说,只有其他的任务完成的时候,这个任务才有可能执行。
ANT里面有许多内置的task,这些task可以用来构建target,比如,你要完成一个编译的任务,那么你就可以引用这个task(javac),看上去象是java内部的命令,其实ant对他进行了封装。例如:
<javac srcdir="${src}"
destdir="${build}"
classpath="xyz.jar"
debug="on"
/>
这个任务将会编译src里面所有的源代码到目标文件夹build,使用的classpath是xyz.jar,并且是debug模式的。
ANT里面还有一个非常有用的task就是与数据库操作相关的一个task(sql),它的原理如下:
通过JDBC执行一系列的sql语句,语句可以从文本文件中读取,也可以通过包含的方式放在任务中。语句之间的间隔使用的是“;”或者自己定义的分割符号。注释的语句使用的是REM或者“――”。可以使用autocommit属性来控制语句是否真的被提交,还可以使用onerror属性来控制当执行的过程中遇到错误的时候应该怎么办?(abort,continue,stop)。
它有下列属性:
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
这样我们每次的工作就减少了很多了。