`
qzterminator
  • 浏览: 22872 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

运用ANT地SQL Task来完成自己地Java执行SQL脚本文件地功能

    博客分类:
  • J2EE
阅读更多
前面记载过一篇Java执行SQL脚本文件,这里边完全是由自己写代码来分离出脚本中的每一个SQL语句的,有不少缺陷。当时还不太清楚ANT本身提供了功能很强的执行SQL语句和脚本的SQL Task可用。以下依次简单介绍如何在 build.xml 中执行SQL语句或脚本;Java代码中如何调用ANT的SQLExec类执行SQL脚本,最后考虑 ant.jar的个头说大也不小,1M 多,如果只用于执行SQL脚本,则绝大部分代码就是垃圾,所以从同抽离出需要的两个类JDBCTask和 SQLExec,完全去除了对ant.jar包的依赖。

1、build.xml 中执行sql 脚本

autocommit="true" 
url="jdbc:oracle:thin:@10.128.x.x:1521:xxsid" src="data.sql" print="yes" output=

"sql_out.txt"> 

autocommit="true"
url="jdbc:oracle:thin:@10.128.x.x:1521:xxsid" src="data.sql" print="yes" output=

"sql_out.txt">

也可以在 ...  中直接包含一条或多条 sql 语句,默认分号分隔。脚本文件 data.sql 中可以写多个语句,也是默认分号分隔,可含 -- 注释符。说白了就是基本在 PL/SQL Developer 中可以怎么写,你的脚本文件中也可以怎么写,并且还能支持象 MySQL 的 // 那样的注释符。

像如下那样的SQL脚本内容(data.sql)

--插入记录  
insert into test_table values(1,'Unmi');

select *
from test_table 
where id>0 and name like '%Unmi' ;  

--删除 ID 为 1 的记录  
delete  from test_table where id=1;
 
--插入记录
insert into test_table values(1,'Unmi');
select *
from test_tablewhere id>0
where id>0 and name like '%Unmi' ;

--删除 ID 为 1 的记录
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 affectedID,NAME1,Unmi0 rows affected1 rows affected
ID,NAME
1,Unmi
0 rows affected
1 rows affected



不过ANT执行的SQL语句不支持行末的注释符 "--",这有待改进。

2、Java代码调用ANT的SQLExec执行脚本文件

package com.unmi;  
import java.io.*;  
import org.apache.tools.ant.*;  
import org.apache.tools.ant.taskdefs.*;  
import org.apache.tools.ant.types.*;  
/** 
* 调用 ant.jar 的 SQLExec 执行 SQL 脚本文件 
* @author Unmi 
*/ 
public class AntExecSql {  
/** 
* @param args 
*/ 
public static void main(String[] args) {  
SQLExec sqlExec = new SQLExec();  
//设置数据库参数  
sqlExec.setDriver("oracle.jdbc.driver.OracleDriver");  
sqlExec.setUrl("jdbc:oracle:thin:@10.128.x.x:1521:xxsid");   sqlExec.setUserid("xxuser");  
sqlExec.setPassword("xxpass");  
//要执行的脚本  
sqlExec.setSrc(new File("src/data.sql"));  
//有出错的语句该如何处理  
sqlExec.setOnerror((SQLExec.OnError)(EnumeratedAttribute.getInstance(SQLExec.OnError.class, "abort")));  
sqlExec.setPrint(true); //设置是否输出  
//输出到文件 sql.out 中;不设置该属性,默认输出到控制台  
sqlExec.setOutput(new File("src/sql.out"));  
sqlExec.setProject(new Project()); // 要指定这个属性,不然会出错   sqlExec.execute();  



package com.unmi;import java.io.*;
import org.apache.tools.ant.*;
import org.apache.tools.ant.taskdefs.*;
import org.apache.tools.ant.types.*;
/**
* 调用 ant.jar 的 SQLExec 执行 SQL 脚本文件
* @author Unmi
*/
public class AntExecSql {
/**
* @param args
*/
public static void main(String[] args) {
SQLExec sqlExec = new SQLExec();
//设置数据库参数
sqlExec.setDriver("oracle.jdbc.driver.OracleDriver");
sqlExec.setUrl("jdbc:oracle:thin:@10.128.x.x:1521:xxsid");
sqlExec.setUserid("xxuser");
sqlExec.setPassword("xxpass");
//要执行的脚本
sqlExec.setSrc(new File("src/data.sql"));
//有出错的语句该如何处理
sqlExec.setOnerror((SQLExec.OnError)(EnumeratedAttribute.getInstance(SQLExec.OnError.class, "abort")));
sqlExec.setPrint(true); //设置是否输出
//输出到文件 sql.out 中;不设置该属性,默认输出到控制台
sqlExec.setOutput(new File("src/sql.out"));
sqlExec.setProject(new Project()); // 要指定这个属性,不然会出错sqlExec.execute();
}
}



项目中需要引入ant.jar,并且在代码中需执行sqlExec.setProject(new Project()); 无意义的操作。其他用法及效果与前面类似。

3、从ant.jar中抽离出需要的类SQLExec和JDBCTask

使用代码如下(AntSqlExec.java):

package com.unmi.sql;  
import java.io.*;  
/** 
* Java 执行 Sql 脚本文件 
* @author Unmi 
*/ 
public class AntSqlExec {  
/** 
* @param args 
* @throws Exception  
*/ 
public static void main(String[] args) throws Exception {
SQLExec sqlExec = new SQLExec();  
//设置数据库参数  
sqlExec.setDriver("oracle.jdbc.driver.OracleDriver");  
sqlExec.setUrl("jdbc:oracle:thin:@10.128.x.x:1521:xsid");   sqlExec.setUserid("xxuser");  
sqlExec.setPassword("xxpass");  
//要执行的脚本  
sqlExec.setSrc(new File("src/data.sql"));  
//有出错的语句该如何处理  
sqlExec.setOnerror(SQLExec.ON_ERROR_ABORT); //abort/conitue/stop   sqlExec.setPrint(true); //设置是否输出  
//输出到文件 sql.out 中;不设置该属性,默认输出到控制台  
sqlExec.setOutput(new File("src/sql.out"));   
sqlExec.execute();  
}  


package com.unmi.sql;
import java.io.*;
/**
* Java 执行 Sql 脚本文件
* @author Unmi
*/
public class AntSqlExec {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
SQLExec sqlExec = new SQLExec();
//设置数据库参数sqlExec.setDriver("oracle.jdbc.driver.OracleDriver");
sqlExec.setUrl("jdbc:oracle:thin:@10.128.x.x:1521:xsid");
sqlExec.setUserid("xxuser");
sqlExec.setPassword("xxpass");
//要执行的脚本
sqlExec.setSrc(new File("src/data.sql"));
//有出错的语句该如何处理
sqlExec.setOnerror(SQLExec.ON_ERROR_ABORT); //abort/conitue/stop
sqlExec.setPrint(true); //设置是否输出
//输出到文件 sql.out 中;不设置该属性,默认输出到控制台
sqlExec.setOutput(new File("src/sql.out"));
sqlExec.execute();
}
}



因SQLExec.java 和JDBCTask.java 代码行较多,不便列出,可下载SQLExec(FromAnt).rar 解开来看。抽取出来的类修改后不再依赖于ANT的Jar 包了(不再需要 引入 org.apache.* 包了),并简化的代码,削去了一些不用的功能,如设置是否是非关系型数据库、设置数据库版本、扩展属性的设置、设置classpath 属性通过自定义类加载器加载驱动等。前面说过,还有点遗憾的是还不支持行末的注释符 "--" 或 "//",还需增强,所以目前使用。

前面讲的大体都是在执行SQL脚本的功能,其实SQLExec 的还提供事物控制的功能。比如autoCommit属性的设置,可同时调入多个SQL脚本文件,让多个SQL脚本同处一个事物当中,更为细致的用法还有待您来发掘,在修改后的 SQLExec.java和JDBCTask.java实用功能都有保留。
分享到:
评论

相关推荐

    ant执行sql文件

    标题中的“ant执行sql文件”指的是使用Apache Ant工具来运行SQL脚本文件,这在Java开发中非常常见,尤其是在数据库的初始化或者自动化部署过程中。Ant是Apache软件基金会的一个项目,它是一个基于Java的构建工具,...

    ant_向数据库插入数据示例文件

    在这个“ant_向数据库插入数据示例文件”中,我们将深入探讨如何使用Ant来执行SQL脚本,从而向SQL Server数据库中插入数据。 首先,我们需要理解Ant脚本的基本结构。一个典型的Ant构建文件(build.xml)包含多个...

    13_ant_发布web项目和操作数据库

    2. `<sql>`任务:这个任务允许运行SQL脚本,可以用来创建表、插入数据、更新或删除记录。你可以提供一个包含SQL语句的文件,或者直接在任务中写入SQL。 3. `<exec>`任务:如果需要执行更复杂的数据库操作,如数据库...

    ant-antlr-1.6.4.jar.zip

    这在构建需要解析特定语法的项目时非常有用,如自定义脚本语言、配置文件解析器或者SQL解析器等。 在实际应用中,"ant-antlr-1.6.4.jar.zip"的使用流程通常是这样的:首先,开发者需要将压缩包解压,将"ant-antlr-...

    ant构件示例说明

    这可能包括编译源码、生成Hibernate的映射文件、创建数据库表、执行SQL脚本,以及打包和部署应用。 2. `build.xml` - 这是Ant的标准构建文件,包含了整个项目构建过程的配置。它可能包含了多个目标,如清理、编译、...

    ANT 快速参考指南

    它使用 XML 文件来描述构建过程中的各种任务,并允许用户通过简单的 XML 配置来控制构建流程。Ant 能够跨平台运行,适用于 Windows、Linux 和 macOS 等操作系统。 **1.2 下载与安装** 1. **下载**:首先从 Apache ...

    ant-eclipselink-schemagen-1.0.6.jar.zip

    Ant的工作原理是通过任务(task)来执行特定的操作,这些任务可以是内置的,也可以是用户自定义的。 2. **EclipseLink**: EclipseLink是Oracle公司贡献给开源社区的一个强大的ORM(对象关系映射)框架,它支持JPA...

    ANT 基础学习小结

    在很多方面,Ant可以被视为Windows下批处理文件(bat)的一种替代方案,但其功能更加强大且灵活。 #### 二、Ant基本概念解析 - **项目(Project)**:是Ant中最顶层的容器,所有的任务都是在一个项目中执行。 - **...

    Ant自定义任务

    Ant基于XML描述构建过程,它的核心概念是任务(Task),这些任务可以执行各种操作,如编译Java代码、复制文件等。然而,预定义的任务可能无法满足所有项目需求,这时就需要创建自定义任务。自定义任务使开发者能够...

    windchill java开发环境手册

    Windchill目录主要包括bin(包含批处理脚本,如Tools.bat,Windchill.exe等),codebase(包含Windchill运行时所需要的文件),db(包含数据库配置文件和SQL脚本),installer(包含安装/更新时产生的日志文件),...

    ssh项目中hbm2dll和hbm2java的使用

    例如,`build.xml`文件是Ant的构建文件,其中可以定义任务来执行`hbm2dll`和`hbm2java`。以下是一个简单的Ant示例: ```xml <property name="src.dir" value="src/main/java"/> ${hibernate-tools.jar}"/> ...

    sonar安装配置指南(sonar+MySQL+ant)原创

    Sonar 是一个强大的静态代码分析和质量管理平台,用于检测代码中的缺陷、代码异味以及潜在的错误。本指南将详细介绍如何在环境中...遵循这些步骤,你可以成功地在自己的环境中搭建起一个功能完备的Sonar质量管理平台。

    HibernateCore的代码生成、逆向工程、ant任务和更多工具___下载.zip

    Hibernate Core 是一个强大的Java对象关系映射(ORM)框架,它极大地简化了数据库与Java应用程序之间的交互。在本文中,我们将深入探讨 Hibernate Core 的几个关键功能:代码生成、逆向工程、Ant 任务以及相关工具的...

    自动获取svn代码并且编译发布

    这通常通过执行 SQL 脚本或者使用数据访问层(如 Hibernate)来完成。 6. **构建脚本 (build.xml)**: 这是 Ant 构建过程的配置文件,定义了构建任务及其依赖关系。示例中的 build.xml 文件包含了 SVN 检出、清理、...

    windchill 开发环境

    - **db**: 包含数据库配置文件和SQL脚本。 - **installer**: 存放安装或更新过程中产生的日志文件。 - **lib**: 包含客户端所需的JavaBeans。 - **loadFiles/loadXMLFiles**: 包含系统初始化的数据文件。 - **logs**...

    jBPM开发入门指南(2)[归类].pdf

    然后,获取jBPM的启动包,例如jbpm-starters-kit-3.1.1,进入jbpm-db目录,执行特定于MySQL的Ant命令(ant mysql.scripts),这将在指定目录下生成SQL脚本。执行这些脚本(如mysql.create.sql)将在"jbpm"库中创建所...

    hibernate

    对于熟悉PL/SQL的开发者来说,这是一个非常有用的工具,因为它们可以无缝地在Eclipse中运行SQL语句,提高开发效率。 ##### 2.4 Hibernate Util类 - **SessionFactory和Session**: HibernateUtil类通常用于管理...

    hibernatetools文档

    - **Ant任务支持**:支持通过Ant脚本执行一系列自动化任务。 ##### 1.2 其他相关资源 - **官方文档**:提供详细的安装指南和使用教程。 - **社区论坛**:用户可以在论坛中交流心得、解决问题。 - **示例项目**:...

    activiti web 建项目步骤

    如果没有Ant,可以通过执行SQL脚本来初始化数据源,脚本通常位于`E:\activiti-5.6\setup\files\dependencies\libs\activiti-engine-5.6-sources.jar`目录下。对于数据库创建脚本的位置,可以参考`E:\activiti-5.6\...

Global site tag (gtag.js) - Google Analytics