2012-08-16 21 views
26

Có cách nào trong liquibase để tạo bộ thay đổi mã java (tức là cung cấp một lớp java, sẽ nhận được kết nối JDBC và sẽ thực hiện một số thay đổi trong cơ sở dữ liệu) không?Thay đổi mã Java trong liquibase

(Tôi biết rằng đường bay có tính năng như vậy)

+0

Tôi không nghĩ vậy –

Trả lời

33

Có, có tính năng như vậy. Bạn có thể tạo một customChange:

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

Các lớp phải thực hiện các giao diện 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

Một ví dụ hoàn chỉnh sẽ giống như thế này

Tạo một lớp mà thực hiện CustomTaskChange hoặc 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; 
    } 

} 

Trong xml changeset bạn có thể sử dụng lớp như sau

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

Đối với tôi các tập tin dữ liệu trong thư mục src/main/nguồn/com/example/dữ liệu

Hy vọng điều này sẽ giúp

Các vấn đề liên quan