如何使用ANT自动进行数据库的相关操作 
  
赵才文([email protected])版权所有 
  
  
       如今的系统,无论是基于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 
  
这样我们每次的工作就减少了很多了。  
 
  |