利用 Ant 的 SQL Task 来实现自己的 Java 执行 SQL 脚本文件的功能
前面记载过一篇 Java 执行 SQL 脚本文件,这里边完全是由自己写代码来分离出脚本中的每一个 SQL 语句的,有不少缺陷。当时还不太清楚 ANT 本身提供了功能很强的执行 SQL 语句和脚本的 SQL Task 可用。以下依次简单介绍如何在 build.xml 中执行 SQL 语句或脚本;Java 代码中如何调用 ant 的 SQLExec 类执行 SQL 脚本,最后考虑 ant.jar 的个头说大也不小,1M 多,如果只用于执行 SQL 脚本,则绝大部分代码就是垃圾,所以从同抽离出需要的两个类 JDBCTask 和 SQLExec,完全去除了对 ant.jar 包的依赖。
有关 ant 的更详细的记录请参见,http://ant.apache.org/manual/CoreTasks/sql.html 。
1. build.xml 中执行 sql 脚本
也可以在 <sql>...</sql> 中直接包含一条或多条 sql 语句,默认分号分隔。脚本文件 data.sql 中可以写多个语句,也是默认分号分隔,可含 -- 注释符。说白了就是基本在 PL/SQL Developer 中可以怎么写,你的脚本文件中也可以怎么写,并且还能支持象 MySQL 的 // 那样的注释符。
像如下那样的 SQL 脚本内容 (data.sql)
ant 执行后控制台输出为:
sql:
Executing resource: E:\Workspace\Eclipse\TestAnt\src\data.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 执行脚本文件
项目中需要引入 ant.jar,并且在代码中需执行 sqlExec.setProject(new Project()); 无意义的操作。其他用法及效果与前面类似。
3. 从 ant.jar 中抽离出需要的类 SQLExec 和 JDBCTask
使用代码如下(AntSqlExec.java):
因 SQLExec.java 和 JDBCTask.java 代码行较多,不便列出,可下载 SQLExec(FromAnt).rar 解开来看。抽取出来的类修改后不再依赖于 ant 的 Jar 包了(不再需要 引入 org.apache.* 包了),并简化的代码,削去了一些不用的功能,如设置是否是非关系型数据库、设置数据库版本、扩展属性的设置、设置 classpath 属性通过自定义类加载器加载驱动等。前面说过,还有点遗憾的是还不支持行末的注释符 "--" 或 "//",还需增强,所以目前使用。
前面讲的大体都是在执行 SQL 脚本的功能,其实 SQLExec 的还提供事物控制的功能。比如 autoCommit 属性的设置,可同时调入多个 SQL 脚本文件,让多个 SQL 脚本同处一个事物当中,更为细致的用法还有待您来发掘,在修改后的 SQLExec.java 和 JDBCTask.java 实用功能都有保留。
永久链接 https://yanbin.blog/ant-sql-task-exec-sql-scripts/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
有关 ant 的更详细的记录请参见,http://ant.apache.org/manual/CoreTasks/sql.html 。
1. build.xml 中执行 sql 脚本
1<project name="TestSqlExec" default="sql">
2 <target name="sql">
3 <sql driver="oracle.jdbc.driver.OracleDriver" password="xxpass" userid="xxuser" autocommit="true"
4 url="jdbc:oracle:thin:@10.128.x.x:1521:xxsid" src="data.sql" print="yes" output="sql_out.txt">
5 <classpath>
6 <pathelement path="d:\oracle\ora90\jdbc\lib\classes12.jar"/>
7 </classpath>
8 </sql>
9 </target>
10</project>也可以在 <sql>...</sql> 中直接包含一条或多条 sql 语句,默认分号分隔。脚本文件 data.sql 中可以写多个语句,也是默认分号分隔,可含 -- 注释符。说白了就是基本在 PL/SQL Developer 中可以怎么写,你的脚本文件中也可以怎么写,并且还能支持象 MySQL 的 // 那样的注释符。
像如下那样的 SQL 脚本内容 (data.sql)
1--插入记录
2insert into test_table values(1,'Unmi');
3
4select *
5from test_table
6 where id>0;
7 --and name like '%Unmi' ;
8
9 --删除 ID 为 1 的记录
10 delete from test_table where id=1;ant 执行后控制台输出为:
sql:
Executing resource: E:\Workspace\Eclipse\TestAnt\src\data.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 执行脚本文件
1package com.unmi;
2
3import java.io.*;
4
5import org.apache.tools.ant.*;
6import org.apache.tools.ant.taskdefs.*;
7import org.apache.tools.ant.types.*;
8
9/**
10 * 调用 ant.jar 的 SQLExec 执行 SQL 脚本文件
11 * @author Unmi
12 */
13public 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):
1package com.unmi.sql;
2
3import java.io.*;
4
5/**
6 * Java 执行 Sql 脚本文件
7 * @author Unmi
8 */
9public 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 实用功能都有保留。
永久链接 https://yanbin.blog/ant-sql-task-exec-sql-scripts/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。