利用ANT的SQL Task來實現本身的Java執行SQL腳本文件的功能

Java代碼中如何調用Ant的SQLExec類執行SQL腳本,最後考慮ant.jar的個頭說大也不小,1M多,若是隻用於執行SQL腳本,則絕大部分代碼就是垃圾,因此從同抽離出須要的兩個類JDBCTask和SQLExec,徹底去除了對ant.jar包的依賴。java

AD:sql

前面記載過一篇Java執行SQL腳本文件,這裏邊徹底是由本身寫代碼來分離出腳本中的每個SQL語句的,有很多缺陷。當時還不太清楚ANT自己提供了功能很強的執行SQL語句和腳本的SQL Task可用。如下依次簡單介紹如何在 build.xml 中執行SQL語句或腳本;Java代碼中如何調用ANT的SQLExec類執行SQL腳本,最後考慮 ant.jar的個頭說大也不小,1M 多,若是隻用於執行SQL腳本,則絕大部分代碼就是垃圾,因此從同抽離出須要的兩個類JDBCTask和 SQLExec,徹底去除了對ant.jar包的依賴。數據庫

一、build.xml 中執行sql 腳本apache

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

"sql_out.txt">  ui

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

"sql_out.txt">spa

也能夠在 ...  中直接包含一條或多條 sql 語句,默認分號分隔。腳本文件 data.sql 中能夠寫多個語句,也是默認分號分隔,可含 -- 註釋符。說白了就是基本在 PL/SQL Developer 中能夠怎麼寫,你的腳本文件中也能夠怎麼寫,而且還能支持象 MySQL 的 // 那樣的註釋符。.net

像以下那樣的SQL腳本內容(data.sql)code

--插入記錄   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_table 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 affected ID,NAME 1,Unmi

0 rows affected 1 rows affected

不過ANT執行的SQL語句不支持行末的註釋符 "--",這有待改進。

二、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()); 無心義的操做。其餘用法及效果與前面相似。

三、從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實用功能都有保留。

相關文章
相關標籤/搜索