Java执行SQL脚本文件

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

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


50.    /**
51.      * 传入连接来执行 SQL 脚本文件,这样可与其外的数据库操作同处一个事物中
52.      * @param conn 传入数据库连接
53.      * @param sqlFile SQL 脚本文件
54.      * @throws Exception
55.      */ 
56.    public void execute(Connection conn, String sqlFile) throws Exception {  
57.         Statement stmt = null;  
58.         List<String> sqlList = loadSql(sqlFile);  
59.         stmt = conn.createStatement();  
60.        for (String sql : sqlList) {  
61.             stmt.addBatch(sql);  
62.         }  
63.        int[] rows = stmt.executeBatch();  
64.         System.out.println("Row count:" + Arrays.toString(rows));  
65.     }  
66. 
67.    /**
68.      * 自建连接,独立事物中执行 SQL 文件
69.      * @param sqlFile SQL 脚本文件
70.      * @throws Exception
71.      */ 
72.    public void execute(String sqlFile) throws Exception {  
73.         Connection conn = DBCenter.getConnection();  
74.         Statement stmt = null;  
75.         List<String> sqlList = loadSql(sqlFile);  
76.        try {  
77.             conn.setAutoCommit(false);  
78.             stmt = conn.createStatement();  
79.            for (String sql : sqlList) {  
80.                 stmt.addBatch(sql);  
81.             }  
82.            int[] rows = stmt.executeBatch();  
83.             System.out.println("Row count:" + Arrays.toString(rows));  
84.             DBCenter.commit(conn);  
85.         } catch (Exception ex) {  
86.             DBCenter.rollback(conn);  
87.            throw ex;  
88.         } finally {  
89.             DBCenter.close(null, stmt, conn);  
90.         }  
91.     }  
92. 
93.    public static void main(String[] args) throws Exception {  
94.         List<String> sqlList = new SqlFileExecutor().loadSql(args[0]);  
95.         System.out.println("size:" + sqlList.size());  
96.        for (String sql : sqlList) {  
97.             System.out.println(sql);  
98.         }  
99.     }  
100.} 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值