Java 执行 SQL 脚本文件

假定Java 程序中要定期执行 SQL 语句,因需求变更应修改原有 SQL 语句或者加上更多的语句时,不得不修改源代码,然后再次编译。要是把 SQL 语句写在单独的 SQL 脚本文件中,由 Java 程序来定时加载执行,那么每次改动时仅仅修改 SQL 脚本文件就行了。

Java 没有提供现成的东西,所以自己写了一个这样的 SQL 脚本执行类 SqlFileExecutor。支持通用的 SQL 脚本文件,"--" 作为注释前导符,分号 ";" 分隔语句。不支持 MySQL 的 /*...*/ 形式的注释格式。对于 Windows 和 Linux/Unix 下编辑的脚本文件都测试通过。这两个系统文件中的换行符不一样,Windows 是 "\r\n",Linux/Unix 是 "\n"。

程序功能:加载 SQL 脚本文件,去除注释行,分离出 SQL 语句;提供两个 execute() 执行方法,分别是传数据库连接与不传连接的。传入连接的方法可以让它与外部数据库操作同处一个事物中,当然如果能用其他机制保证事物的原子性也行。另一个是自己管理数据库资源,例子中的 DBCenter 类留给读者自己来实现,包括获取、关闭连接,提交、回滚事物方法。

类别: Java/JEE. 标签: , . 阅读(2,727). 订阅评论. TrackBack.

Leave a Reply

19 Comments on "Java 执行 SQL 脚本文件"

avatar
lj
Guest
lj

Connection conn = DBCenter.getConnection();这个DBCenter的类你是怎么写的

隔叶黄莺
Guest

@Lc

用分号分隔的,所以会出错,这是我当时的一个项目中因为需求简单才自己写了一个这样的程序,如果要功能强的话,最好参考下 ant 和 dbUnit 的做法。

tttl
Guest
tttl

楼主有 测试过么,期待回复

tttl
Guest
tttl

为什么我用了楼主的方法,一到执行那条语句就出错了?

Lc
Guest
Lc

加入有这样一个sql:
INSERT INTO ×××(title, content) VALUES('这是标题', '内容;内容');

因为“'内容;内容'”中有“;”这个程序会出错的

Lc
Guest
Lc

loadSql 中的 InputStream sqlFileIn 忘记关闭了

yyf365
Guest
yyf365

如果我想执行的是一个建立存储过程的SQL脚本呢?

存储过程建立本身不是一句一句执行的,请问能否使用程序进行整个存储过程SQL执行呢?

隔叶黄莺
Guest

那就是事物务理要做的事情了

newday
Guest
newday

请问SQL脚本中的语句有错误该怎么处理

隔叶黄莺
Guest

还会进一步发掘 Ant 是如何提供执行 SQL 脚本文件支持的。

隔叶黄莺
Guest

脚本语言个人还是习惯 Perl,它那强大的正则表达式是无与伦比的。有说 Perl 不适合于大项目,确实,但如果是大项目,我又会选择用 Java。groovy 还不太习惯,虽说它写的东西也是编译成 JVM 可执行的字节码,还能使用到 Java 的任何特性,但觉得有点麻烦,语法也不适应,Ruby就更不用说了,还会激起民族情绪。Perl 写界面也行,可以用好几个界面组件库,如 TK、wxWidgets 或 QT。

dreampursuer
Guest
dreampursuer

建议试试groovy来进行这项工作,so easy

隔叶黄莺
Guest

谢谢楼上的提醒,我再次查了一下 ant 文档,执行 SQL 脚本文件,和多条 SQL 语句都行,它有的例子是:

<sql driver="org.database.jdbcDriver" url="jdbc:database-url" userid="sa" password="pass" src="data.sql"/>



<sql driver="org.database.jdbcDriver" url="jdbc:database-url" userid="sa" password="pass" >

insert

into table some_table values(1,2,3,4);

truncate table some_other_table; </sql>

所以如果是写在代码里,完全可以参考 ANT 源代码,它的实现考虑的更完善。把东西写下来,众人众说,总能起到抛砖引玉的作用。

guest
Guest
guest

@隔叶黄莺

ant执行一个sql文件完全没有问题...

所有的sql放到一个文件中...

隔叶黄莺
Guest

确实,刚开始着手解决这个问题的时候考虑过用 iBatis。考虑到 iBatis 对一条语句一个配置的确很合适,但要一个脚本文件中批处理的执行 SQL 语句就有欠妥。也参考过 ANT 中的 任务的实现,但也是针对一条语句的执行。

tony01
Guest
tony01

try iBATIS ^^

隔叶黄莺
Guest

这是与数据库相关的命令了,如果是 Statement.execute() 能执行的 SQL 语句就行

爱上鸟的鱼
Guest

您好,我想定时执行 export to c:\pro.ixf of ixf select * from pro 。这样的 sql 。是db2的。可以吗?这个是单表导出数据的写法。

wpDiscuz