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?

60
demandé sur Peter Mortensen 2009-06-25 18:14:24

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.

JDBC ScriptRunner

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!

69
répondu jitter 2015-07-18 19:16:08

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.

22
répondu Amir Raminfar 2013-11-07 16:16:11

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();
    }
13
répondu Abdull 2012-11-04 02:03:10

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();
    }
  }
6
répondu lunicon 2014-08-19 06:52:06

@Pantelis Sopasakis

version légèrement modifiée sur GitHub: https://gist.github.com/831762 /

C'est plus facile d'y suivre les modifications.

3
répondu joe776 2011-02-17 14:20:34

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.

2
répondu Pantelis Sopasakis 2011-02-16 09:50:59

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.

2
répondu Haroldo_OK 2016-01-21 13:52:15

écrire le code à:

  1. Lire un fichier contenant un certain nombre d'instructions SQL.
  2. exécutez chaque instruction SQL.
1
répondu matt b 2009-06-25 14:17:34

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 () -.

1
répondu Gregor 2010-07-06 13:19:25

Maven SQL Plugin utilisez ce plugin pour exécuter des instructions SQL un fichier ou une liste de fichiers à travers

  1. sqlCommand
  2. srcFiles 3.fileset configurations
1
répondu kapil das 2013-08-15 14:08:08

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);
}
1
répondu Muskovets 2017-08-27 05:17:22

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.

0
répondu jitter 2009-06-25 14:21:52