liquibase 中的 Java 代码变更集
Posted
技术标签:
【中文标题】liquibase 中的 Java 代码变更集【英文标题】:Java code changeset in liquibase 【发布时间】:2012-08-12 19:40:54 【问题描述】:在 liquibase 中有没有办法创建 java 代码更改集(即提供一个 java 类,它将接收 JDBC 连接并在数据库中执行一些更改)?
(我知道flyway有这样的功能)
【问题讨论】:
【参考方案1】:是的,有这样的功能。你可以创建一个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 !
【讨论】:
需要关闭jdbc连接吗? @paulj 不,没有必要(甚至不希望)关闭底层 JDBC 连接。它会在适当的时候被 Liquibase 关闭。 参数有什么作用?【参考方案2】:一个完整的例子如下所示
创建一个实现 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 目录中
希望对你有帮助
【讨论】:
需要关闭jdbc连接吗?以上是关于liquibase 中的 Java 代码变更集的主要内容,如果未能解决你的问题,请参考以下文章