Набор изменений кода Java в liquibase

Есть ли способ в liquibase создать набор изменений кода Java (т.е. предоставить класс Java, который получит соединение JDBC и внесет некоторые изменения в базу данных)?

(я знаю, что у пролетного пути есть такая функция)


person Pavel Bernshtam    schedule 16.08.2012    source источник


Ответы (2)


Да, есть такая функция. Вы можете создать 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 !
    }
}
person poussma    schedule 16.08.2012
comment
необходимо закрыть соединение jdbc? - person paulj; 15.06.2020
comment
@paulj Нет, нет необходимости (и даже нежелательно) закрывать базовое соединение JDBC. Он будет закрыт Liquibase, когда это будет уместно. - person Ruslan Stelmachenko; 21.11.2020
comment
Что делает параметр? - person Albert Hendriks; 11.01.2021

Полный пример будет выглядеть так

Создайте класс, реализующий CustomTaskChange или 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;
    }

}

В XML-файле набора изменений вы можете использовать класс, как показано ниже

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

Для меня файл данных находится в каталоге src/main/resources/com/example/data.

Надеюсь это поможет

person Murali    schedule 10.08.2013
comment
необходимо закрыть соединение jdbc? - person paulj; 15.06.2020