Add a Change Type
Prerequisites
Implementing Liquibase extensions requires an understanding of Java. You will be creating classes, overriding methods, and working with inheritance hierarchies.
Project Setup
If you have not already created a repository to hold your code, see Your First Extension in the Getting Started guide.
Overview
When adding support for a new change type, the interface you are going to implement is liquibase.change.Change
.
Change implementations do not need to be thread-safe. ChangeFactory will generate a new instance of them each time they are used.
Tip
There is a liquibase.change.AbstractChange base class you can use which limits the number of methods you must implement.
API Documentation
A complete description of the API, including what methods must be implemented and how is available on the liquibase.change.Change API page.
Example Code
package com.example.change;
import liquibase.change.AbstractChange;
import liquibase.change.ChangeMetaData;
import liquibase.change.DatabaseChange;
import liquibase.database.Database;
import liquibase.statement.SqlStatement;
import liquibase.statement.core.UpdateStatement;
@DatabaseChange(
name = "setPassword",
description = "Sets a user's password",
priority = ChangeMetaData.PRIORITY_DEFAULT
)
public class SetPasswordChange extends AbstractChange {
private String username;
private String password;
@Override
public SqlStatement[] generateStatements(Database database) {
return new SqlStatement[]{
new UpdateStatement(null, null, "app_users")
.addNewColumnValue("password", password)
.setWhereClause("username='" + database.escapeStringForDatabase(username) + "'")
};
}
@Override
public String getConfirmationMessage() {
return "Password has been changed for " + username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}