回答

收藏

通过Java执行.sql文件

技术问答 技术问答 259 人阅读 | 0 人回复 | 2023-09-14

我有一个sql脚本文件,我需要通过java执行其中的命令。我在互联网上搜索了相同的内容,得到了一些定义解析器的代码以拆分SQL语句并执行该代码。但是它们都不适合我的sql脚本文件。因为我的脚本文件同时包含create语句和alter语句,但不带分号[相反,它具有GO]有人可以建议一种执行脚本文件的解决方案吗?谢谢,Mahesh1 `$ R" H' y0 {* P: c( j/ p
                2 V$ P- Y5 y; h; B" w
解决方案:
4 E1 v  h  m7 q1 w% y* U                1 d- m9 D" z& q# |7 a' ]. m

# ~$ a8 `. j1 y/ ]
' @9 i1 C2 ], Y$ t6 l! ]                对于简单的脚本,我通常使用ibatis-
& T/ M% B, @. A* z. q( nScriptRunner中的此类。另外,您可以从Java生成一个新的数据库客户端进程,并输入您不想执行的脚本。例如,当更改sql文件中的定界符时,像ScriptRunner这样的简单解决方案就无法很好地工作,这将适用于所有脚本。# R# ]0 y- U' B( {& f
这是一个示例,该示例如何将sql作为字符串提供给Spawed db客户端进程:3 ^2 q2 h6 T/ D4 `, ]+ c/ q
private void runSql(String pSql) {! u# b6 b4 t1 M& C; k( `
        String tCommand = "mysql -u " + username + (password != null ? " -p" + password : "") + " " + dbName;8 M, z" l1 K1 Y. ^
        System.out.println(tCommand);2 O# W5 B, H0 R
        try {( i, Q2 t3 \2 J* ^& j' I) D
            Process tProcess = Runtime.getRuntime().exec(tCommand);& q* `) U2 k) Y3 w! s
            OutputStream tOutputStream = tProcess.getOutputStream();
. V3 B/ J5 e1 \+ A% N            Writer w = new OutputStreamWriter(tOutputStream);
* }" @! ^$ c2 K# `9 v! z: m# }# f            System.out.println(pSql);
' l2 B9 d  [7 k$ ]% C0 F* d            w.write(pSql);
% ?: y9 f2 i. u' X! |            w.flush();9 X( w" w9 n" |+ @/ B( K
            Scanner in = new Scanner(tProcess.getErrorStream());" {. R/ S3 {9 x/ h' ~
            String errorMessage = "";5 r( @8 Z. z3 {/ y; H/ }' t* |9 x& v
            while (in.hasNext()) {" [) ]& u" N3 j& F
                errorMessage += in.next() + " ";
  X* G$ f% }  t8 j# [9 W! B+ t& f            }5 Z0 b4 Q1 d9 B+ N* ?
            if (errorMessage.length() > 0) {
, _' Y& m2 b1 e7 R" V7 m  Q                System.out.println(errorMessage);
/ u: h6 ?1 h5 s* l7 h' ?                throw new ClientSqlExecutionException(errorMessage);) H9 ^% P* o) Q
            }* D8 `% x. J# a( z) y) M% {
        } catch (IOException e) {
7 {' ?- A# l) ^! p2 v            e.printStackTrace();
& s6 E2 r- \/ K  F; S7 A& x        }
8 t; e2 Z' w, W    }
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则