2012-08-16 21 views
26

liquibaseでJavaコードチェンジセットを作成する方法がありますか(つまり、JDBC接続を受け取り、データベースにいくつかの変更を行うJavaクラスを提供します)?liquibaseのJavaコードチェンジセット

(私にはこのような機能があることがわかっています)

+0

私はそうは思わない –

答えて

33

はい、そのような機能があります。あなたはcustomChangeを作成することができます。

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

クラスが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

完全な例では、この

次のようになりますCustomTaskChangeまたはCustomSqlChangeを実装するクラスを作成します。あなたは私のデータファイルについて

<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> 

以下のようにクラスを使用することができチェンジのXMLで

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

} 

はSRC /メイン/リソース/ COM /例/ dataディレクトリにある

希望すると便利です

関連する問題