2012-08-16 5 views
26

C'è un modo in liquibase per creare il set di modifica del codice java (cioè fornire una classe java, che riceverà una connessione JDBC ed eseguirà alcune modifiche nel database)?changeset codice Java in liquibase

(so che flyway ha tale caratteristica)

+0

Io non la penso così –

risposta

33

sì, c'è tale caratteristica. È possibile creare un customChange:

<customChange class="my.java.Class"> 
     <param name="id" value="2" /> 
    </customChange> 

la classe deve implementa l'interfaccia liquibase.change.custom.CustomTaskChange.

@Override 
public void execute(final Database arg0) throws CustomChangeException { 
    JdbcConnection dbConn = (JdbcConnection) arg0.getConnection(); 
    try { 
     ... do funny stuff ... 
    } catch (Exception e) { 
     // swallow the exception ! 
    } 
} 
19

Un esempio completo sarà simile a questa

creare una classe che implementi CustomTaskChange o CustomSqlChange.

package com.example; 

import liquibase.change.custom.CustomTaskChange; 
import liquibase.database.Database; 
import liquibase.database.jvm.JdbcConnection; 
import liquibase.exception.CustomChangeException; 
import liquibase.exception.SetupException; 
import liquibase.exception.ValidationErrors; 
import liquibase.logging.LogFactory; 
import liquibase.resource.ResourceAccessor; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 

public class DataLoaderTask implements CustomTaskChange { 

    //to hold the parameter value 
    private String file; 


    private ResourceAccessor resourceAccessor; 


    public String getFile() { 
     return file; 
    } 

    public void setFile(String file) { 
     this.file = file; 
    } 


    @Override 
    public void execute(Database database) throws CustomChangeException { 
     JdbcConnection databaseConnection = (JdbcConnection) database.getConnection(); 
     try { 

      //Opening my data file 
      BufferedReader in = new BufferedReader(
        new InputStreamReader(resourceAccessor.getResourceAsStream(file))); 

      //Ignore header 
      String str = in.readLine(); 

      while ((str = in.readLine()) != null && !str.trim().equals("")) { 
       LogFactory.getLogger().info("Processing line "+ str); 
       //Do whatever is necessary 
      } 
      in.close(); 
     } catch (Exception e) { 
      throw new CustomChangeException(e); 
     } 
    } 

    @Override 
    public String getConfirmationMessage() { 
     return null; 
    } 

    @Override 
    public void setUp() throws SetupException { 

    } 

    @Override 
    public void setFileOpener(ResourceAccessor resourceAccessor) { 
     this.resourceAccessor = resourceAccessor; 
    } 

    @Override 
    public ValidationErrors validate(Database database) { 
     return null; 
    } 

} 

nel XML di modifiche è possibile utilizzare la classe come di seguito

<changeSet id="1" author="murali" runAlways="false" failOnError="true" > 
     <customChange class="com.example.DataLoaderTask"> 
      <param name="file" value="/com/example/data/user.csv" /> 
     </customChange> 
</changeSet> 

Per me il file di dati si trova nella directory src/main/risorse/com/es/dati

Spero che questo aiuti