Comment exécuter un fichier de Script SQL en Java?
je veux exécuter un fichier de script SQL en Java sans lire tout le contenu du fichier dans une grande requête et l'exécuter.
Est-il un autre moyen standard?
9 réponses
Il n'y a aucun moyen portable de faire cela. Vous pouvez exécuter un client natif comme un programme externe pour le faire:
import java.io.*;
public class CmdExec {
public static void main(String argv[]) {
try {
String line;
Process p = Runtime.getRuntime().exec
("psql -U username -d dbname -h serverhost -f scripfile.sql");
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
}
catch (Exception err) {
err.printStackTrace();
}
}
}
- l'échantillon de Code a été extrait de ici et modifié pour répondre à la question en supposant que l'utilisateur veut exécuter un fichier de script PostgreSQL.
il y a une bonne façon d'exécuter des scripts SQL depuis Java sans les lire vous-même tant que cela ne vous dérange pas d'avoir une dépendance sur Ant. À mon avis, une telle dépendance est très bien justifié dans votre cas. Voici un exemple de code, où la classe SQLExec vit à ant.jar:
private void executeSql(String sqlFilePath) {
final class SqlExecuter extends SQLExec {
public SqlExecuter() {
Project project = new Project();
project.init();
setProject(project);
setTaskType("sql");
setTaskName("sql");
}
}
SqlExecuter executer = new SqlExecuter();
executer.setSrc(new File(sqlFilePath));
executer.setDriver(args.getDriver());
executer.setPassword(args.getPwd());
executer.setUserid(args.getUser());
executer.setUrl(args.getUrl());
executer.execute();
}
Non, vous devez lire le fichier, le diviser en requêtes séparées puis les exécuter individuellement (ou en utilisant l'API batch de JDBC).
une des raisons est que chaque base de données définit sa propre façon de séparer les instructions SQL (certaines utilisent ;
, d'autres /
, certains permettent à la fois ou même de définir votre propre séparateur).
vous ne pouvez pas utiliser JDBC car il ne supporte pas . Le travail autour serait d'inclure iBatis iBATIS est un cadre de persistance et d'appeler le Scriptrunner
constructeur comme le montre iBatis documentation .
il n'est pas bon d'inclure un cadre de persistance de poids lourd comme ibatis afin d'exécuter des scripts sql simples de n'importe quelle façon que vous pouvez faire en utilisant la ligne de commande
$ mysql -u root -p db_name < test.sql
de la voie de migration de la bibliothèque est vraiment bon pour ceci:
Flyway flyway = new Flyway();
flyway.setDataSource(dbConfig.getUrl(), dbConfig.getUsername(), dbConfig.getPassword());
flyway.setLocations("classpath:db/scripts");
flyway.clean();
flyway.migrate();
C'scanne les emplacements pour les scripts et les exécute dans l'ordre. Les Scripts peuvent être suivis en versions avec V01__name.sql donc si seulement le migrate est appelé alors seuls ceux qui ne sont pas déjà lancés seront lancés. Utilise une table appelée 'schema_version' pour garder la trace des choses. Mais elle peut faire d'autres choses, voir la doc: de la voie de migration.
l'appel propre n'est pas nécessaire, mais utile pour commencer à partir d'un DB propre. Aussi, soyez conscient de la emplacement (la valeur par défaut est "classpath:db/migration"), il n'y a pas d'espace après le ':', que l'on m'a pris.
comme JDBC ne supporte pas cette option, la meilleure façon de résoudre cette question Est d'exécuter des lignes de commande via le programme Java. Le soufflet est un exemple pour postgresql:
private void executeSqlFile() {
try {
Runtime rt = Runtime.getRuntime();
String executeSqlCommand = "psql -U (user) -h (domain) -f (script_name) (dbName)";
Process pr = rt.exec();
int exitVal = pr.waitFor();
System.out.println("Exited with error code " + exitVal);
} catch (Exception e) {
System.out.println(e.toString());
}
}
l'outil externe le plus simple que j'ai trouvé qui est aussi portable est jisql -https://www.xigole.com/software/jisql/jisql.jsp