利用 Ant 的 SQL Task 来实现自己的 Java 执行 SQL 脚本文件的功能

前面记载过一篇 Java 执行 SQL 脚本文件,这里边完全是由自己写代码来分离出脚本中的每一个 SQL 语句的,有不少缺陷。
当时还不太清楚 ANT 本身提供了功能很强的执行 SQL 语句和脚本的 SQL Task 可用。
以下依次简单介绍如何在 build.
xml 中执行 SQL 语句或脚本;Java 代码中如何调用 ant 的 SQLExec 类执行 SQL 脚本,最后考虑 ant.
jar 的个头说大也不小?
?M 多,如果只用于执行 SQL 脚本,则绝大部分代码就是垃圾,所以从同抽离出需要的两个类 JDBCTask 和 SQLExec,完全去除了对 ant.
jar 包的依赖。
 有关 ant 的更详细的记录请参见,http://ant.
apache.
org/manual/CoreTasks/sql.
html 。
 1.
 build.
xml 中执行 sql 脚本 01.
 02.
 03.
 05.
 06.
 07.
 08.
 09.
 10.
 也可以在 .
.
.
 中直接包含一条或多条 sql 语句,默认分号分隔。
脚本文件 data.
sql 中可以写多个语句,也是默认分号分隔,可含 -- 注释符。
说白了就是基本在 PL/SQL Developer 中可以怎么写,你的脚本文件中也可以怎么写,并且还能支持象 MySQL 的 // 那样的注释符。
 像如下那样的 SQL 脚本内容 (data.
sql) 01.
 --插入记录 02.
 insert into test_table values(1,'Unmi'); 03.
 04.
 select * 05.
 from test_table 06.
 where id>0; 07.
 --and name like '%Unmi' ; 08.
 09.
 --删除 ID 为 1 的记录 10.
 delete from test_table where id=1; ant 执行后控制台输出为: sql: [sql] Executing resource: E:/Workspace/Eclipse/TestAnt/src/data.
sql [sql] 3 of 3 SQL statements executed successfully sql_out.
text 中的输出内容是: 1 rows affected ID,NAME 1,Unmi 0 rows affected 1 rows affected 不过 ant 执行的 sql 语句不支持行末的注释符 "--",这有待改进。
 2.
 Java 代码调用 ant 的 SQLExec 执行脚本文件 01.
 package com.
unmi; 02.
 03.
 import java.
io.
*; 04.
 05.
 import org.
apache.
tools.
ant.
*; 06.
 import org.
apache.
tools.
ant.
taskdefs.
*; 07.
 import org.
apache.
tools.
ant.
types.
*; 08.
 09.
 /** 10.
 * 调用 ant.
jar 的 SQLExec 执行 SQL 脚本文件 11.
 * @author Unmi 12.
 */ 13.
 public class AntExecSql { 14.
 15.
 /** 16.
 * @param args 17.
 */ 18.
 public static void main(String[] args) { 19.
 SQLExec sqlExec = new SQLExec(); 20.
 21.
 //设置数据库参数 22.
 sqlExec.
setDriver("oracle.
jdbc.
driver.
OracleDriver"); 23.
 sqlExec.
setUrl("jdbc:oracle:thin:@10.
128.
x.
x:1521:xxsid"); 24.
 sqlExec.
setUserid("xxuser"); 25.
 sqlExec.
setPassword("xxpass"); 26.
 27.
 //要执行的脚本 28.
 sqlExec.
setSrc(new File("src/data.
sql")); 29.
 30.
 //有出错的语句该如何处理 31.
 sqlExec.
setOnerror((SQLExec.
OnError)(EnumeratedAttribute.
getInstance( 32.
 SQLExec.
OnError.
class, "abort"))); 33.
 34.
 sqlExec.
setPrint(true); //设置是否输出 35.
 36.
 //输出到文件 sql.
out 中;不设置该属性,默认输出到控制台 37.
 sqlExec.
setOutput(new File("src/sql.
out")); 38.
 sqlExec.
setProject(new Project()); // 要指定这个属性,不然会出错 39.
 sqlExec.
execute(); 40.
 } 41.
 } 项目中需要引入 ant.
jar,并且在代码中需执行 sqlExec.
setProject(new Project()); 无意义的操作。
其他用法及效果与前面类似。
 3.
 从 ant.
jar 中抽离出需要的类 SQLExec 和 JDBCTask 使用代码如下(AntSqlExec.
java): 01.
 package com.
unmi.
sql; 02.
 03.
 import java.
io.
*; 04.
 05.
 /** 06.
 * Java 执行 Sql 脚本文件 07.
 * @author Unmi 08.
 */ 09.
 public class AntSqlExec { 10.
 11.
 /** 12.
 * @param args 13.
 * @throws Exception 14.
 */ 15.
 public static void main(String[] args) throws Exception { 16.
 SQLExec sqlExec = new SQLExec(); 17.
 18.
 //设置数据库参数 19.
 sqlExec.
setDriver("oracle.
jdbc.
driver.
OracleDriver"); 20.
 sqlExec.
setUrl("jdbc:oracle:thin:@10.
128.
x.
x:1521:xsid"); 21.
 sqlExec.
setUserid("xxuser"); 22.
 sqlExec.
setPassword("xxpass"); 23.
 24.
 //要执行的脚本 25.
 sqlExec.
setSrc(new File("src/data.
sql")); 26.
 27.
 //有出错的语句该如何处理 28.
 sqlExec.
setOnerror(SQLExec.
ON_ERROR_ABORT); //abort/conitue/stop 29.
 30.
 sqlExec.
setPrint(true); //设置是否输出 31.
 32.
 //输出到文件 sql.
out 中;不设置该属性,默认输出到控制台 33.
 sqlExec.
setOutput(new File("src/sql.
out")); 34.
 sqlExec.
execute(); 35.
 } 36.
 } 因 SQLExec.
java 和 JDBCTask.
java 代码行较多,不便列出,可下载 SQLExec(FromAnt).
rar 解开来看。
抽取出来的类修改后不再依赖于 ant 的 Jar 包了(不再需要 引入 org.
apache.
* 包了),并简化的代码,削去了一些不用的功能,如设置是否是非关系型数据库、设置数据库版本、扩展属性的设置、设置 classpath 属性通过自定义类加载器加载驱动等。
前面说过,还有点遗憾的是还不支持行末的注释符 "--" 或 "//",还需增强,所以目前使用。
 前面讲的大体都是在执行 SQL 脚本的功能,其实 SQLExec 的还提供事物控制的功能。
比如 autoCommit 属性的设置,可同时调入多个 SQL 脚本文件,让多个 SQL 脚本同处一个事物当中,更为细致的用法还有待您来发掘,在修改后的 SQLExec.
java 和 JDBCTask.
java 实用功能都有保留。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值