Je cours.script sql utilisant MySQL avec JDBC
je commence à utiliser MySQL avec JDBC.
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///x", "x", "x");
stmt = conn.createStatement();
stmt.execute( "CREATE TABLE amigos" +
"("+
"id int AUTO_INCREMENT not null,"+
"nombre char(20) not null,"+
"primary key(id)" +
")");
j'ai 3-4 tables à créer et cela ne semble pas bon.
Est-il un moyen de lancer une .script sql de MySQL JDBC?
12 réponses
Ok. Vous pouvez utiliser cette classe ici (posté sur pastebin en raison de la longueur du fichier) dans votre projet. Mais n'oubliez pas de garder les informations de la licence apache.
c'est ripoff du ScriptRunner iBatis avec les dépendances supprimées.
Vous pouvez l'utiliser comme ceci
Connection con = ....
ScriptRunner runner = new ScriptRunner(con, [booleanAutoCommit], [booleanStopOnerror]);
runner.runScript(new BufferedReader(new FileReader("test.sql")));
C'est ça!
j'ai fait beaucoup de recherche sur ce et trouvé un bon util de printemps . Je pense que l'utilisation de SimpleJdbcTestUtils.executeSqlScript(...)
est en fait la meilleure solution, car il est plus maintenu et testé.
Edit: SimpleJdbcTestUtils
est obsolète. Vous devez utiliser JdbcTestUtils
. Mise à jour du lien.
Spring Framework ResourceDatabasePopulator
may help. Comme vous avez dit que vous utilisiez MySQL et JDBC, supposons que vous ayez une instance MySQL-backed DataSource
prête. En outre, supposons que vos fichiers de script MySQL sont classpath-localisable. Supposons que vous utilisez War layout et que les fichiers de script sont situés dans un répertoire src/main/webapp/resources/mysql-scripts/...
ou src/test/resources/mysql-scripts/...
. Ensuite ,vous pouvez utiliser ResourceDatabasePopulator
pour exécuter des scripts SQL comme ceci:
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import javax.sql.DataSource;
DataSource dataSource = getYourMySQLDriverBackedDataSource();
ResourceDatabasePopulator rdp = new ResourceDatabasePopulator();
rdp.addScript(new ClassPathResource(
"mysql-scripts/firstScript.sql"));
rdp.addScript(new ClassPathResource(
"mysql-scripts/secondScript.sql"));
try {
Connection connection = dataSource.getConnection();
rdp.populate(connection); // this starts the script execution, in the order as added
} catch (SQLException e) {
e.printStackTrace();
}
pour le script sql simple divisé par ';' vous pouvez utiliser cette fonction simple. Il supprime les commentaires et exécute les instructions un par un
static void executeScript(Connection conn, InputStream in)
throws SQLException
{
Scanner s = new Scanner(in);
s.useDelimiter("/\*[\s\S]*?\*/|--[^\r\n]*|;");
Statement st = null;
try
{
st = conn.createStatement();
while (s.hasNext())
{
String line = s.next().trim();
if (!line.isEmpty())
st.execute(line);
}
}
finally
{
if (st != null)
st.close();
}
}
@Pantelis Sopasakis
version légèrement modifiée sur GitHub: https://gist.github.com/831762 /
C'est plus facile d'y suivre les modifications.
en ce qui concerne SQL script runner (que j'utilise aussi), j'ai remarqué le morceau de code suivant:
for (int i = 0; i < cols; i++) {
String value = rs.getString(i);
print(value + "\t");
}
cependant, dans la documentation API pour la méthode getString (int) il est mentionné que index commence par 1 , donc cela devrait devenir:
for (int i = 1; i <= cols; i++) {
String value = rs.getString(i);
print(value + "\t");
}
deuxièmement, cette implémentation de ScriptRunner ne prend pas en charge les déclarations DELIMITER dans le script SQL qui sont important si vous devez compiler des déclencheurs ou des procédures. J'ai donc créé cette version modifiée de ScriptRunner: http://pastebin.com/ZrUcDjSx qui, je l'espère, vous sera utile.
une autre option intéressante serait d'utiliser Jisql pour exécuter les scripts. Puisque le code source est disponible, il devrait être possible de l'intégrer dans une application.
Edit: pris soin de regarder; en l'intégrant à l'intérieur de quelque chose d'autre allait nécessiter quelques modifications à son code source.
écrire le code à:
- Lire un fichier contenant un certain nombre d'instructions SQL.
- exécutez chaque instruction SQL.
pour Oracle PL / SQL, le pilote JDBC D'Oracle supporte effectivement l'exécution de scripts SQL entiers, y compris les procédures stockées et les blocs anonymes (notation spécifique PL / SQL), voir
les pilotes JDBC peuvent-ils accéder aux procédures stockées PL/SQL?
le Oracle JDBC driver FAQ a plus d'information:
les pilotes Oracle JDBC soutiennent l'exécution des procédures stockées PL / SQL et les blocs anonymes. Ils soutiennent à la fois SQL92 escape syntaxe et Oracle PL / SQL bloc de syntaxe. Le PL/SQL suivant les appels fonctionneraient avec N'importe quel Oracle JDBC conducteur:
// SQL92 syntax
CallableStatement cs1 = conn.prepareCall
( "{call proc (?,?)}" ) ; // stored proc
CallableStatement cs2 = conn.prepareCall
( "{? = call func (?,?)}" ) ; // stored func
// Oracle PL/SQL block syntax
CallableStatement cs3 = conn.prepareCall
( "begin proc (?,?); end;" ) ; // stored proc
CallableStatement cs4 = conn.prepareCall
( "begin ? := func(?,?); end;" ) ; // stored func
il devrait être possible de lire dans un fichier et d'alimenter le contenu à la méthode preprecall () -.
Maven SQL Plugin utilisez ce plugin pour exécuter des instructions SQL un fichier ou une liste de fichiers à travers
- sqlCommand
- srcFiles 3.fileset configurations
pouvez-vous utiliser ceci:
public static void executeSQL(File f, Connection c) throws Exception {
BufferedReader br = new BufferedReader(new FileReader(f));
String sql = "", line;
while ((line = br.readLine()) != null) sql += (line+"\n");
c.prepareCall(sql).execute(sql);
}
il n'y a pas vraiment de moyen de faire ça.
vous pouvez soit exécuter le client mysql en ligne de commande via Runtime.exec (chaîne[]) et lire cet article lorsque vous décidez pour cette option
Ou essayez d'utiliser la ScriptRunner (com.ibatis.commun.jdbc.ScriptRunner) from ibatis . Mais c'est un peu stupide d'inclure une bibliothèque entière juste pour exécuter un script.