68 votes

Exécution d'un script .sql avec 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 n'a pas l'air bien.

Existe-t-il un moyen d'exécuter un script .sql à partir de MySQL JDBC?

74voto

jitter Points 35805

D'accord. Vous pouvez utiliser cette classe ici (publiée sur pastebin en raison de la longueur du fichier) dans votre projet. Mais souvenez-vous de garder les informations de licence Apache.

JDBC ScriptRunner

C'est l'arnaque de l'iBatis ScriptRunner avec les dépendances supprimées.

Vous pouvez l'utiliser comme ça

 Connection con = ....
ScriptRunner runner = new ScriptRunner(con, [booleanAutoCommit], [booleanStopOnerror]);
runner.runScript(new BufferedReader(new FileReader("test.sql")));
 

C'est tout!

26voto

Amir Raminfar Points 17939

J'ai fait beaucoup de recherche sur ce sujet et a trouvé un bon util à partir du printemps. Je pense que l'utilisation d' SimpleJdbcTestUtils.executeSqlScript(...) est effectivement la meilleure solution, car il est plus entretenu et testé.

Edit: SimpleJdbcTestUtils est obsolète. Vous devez utiliser JdbcTestUtils. Mis à jour le lien.

16voto

Abdull Points 1666

Les cadres ResourceDatabasePopulator Spring Framework peuvent aider. Comme vous l'avez dit, vous utilisez MySQL et JDBC, supposons que vous disposiez d'une instance DataSource sauvegardée par MySQL. De plus, supposons que vos fichiers de script MySQL soient localisables par chemin de classe. Supposons que vous utilisez la disposition WAR et que les fichiers de script se trouvent 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();
    }
 

6voto

lunicon Points 141

Pour un script SQL simple scindé par ';' vous pouvez utiliser cette fonction simple. Il supprime les commentaires et exécute les instructions une par une

   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();
    }
  }
 

5voto

joe776 Points 536

@Pantelis Sopasakis

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

Il est plus facile de suivre les modifications là-bas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X