如何使用Spring操作生产数据库数据格式?

时间:2018-03-03 18:49:37

标签: java spring hibernate spring-data flyway

情况如下:

  • Spring生产应用程序使用带varchar列(MySQL)的表,
  • 我需要将列更改为二进制blob,
  • 并加密现有数据(使用Java,而不是数据库)。

此过程的两个已知步骤是:

  • 我需要更新实体,更改注释(从varchar到blob)
  • 我需要运行迁移更改列格式(使用带Flyway的SQL)
  • 当我停止应用程序,替换应用程序jar(更改为新版本)并再次运行时,所有这些都将完成。

问题:

  • 当它仍然是varchar时,我需要从列中获取旧数据,使用Java加密它,并在迁移后再将它存储在blob列中。 (更改后输入的新数据不是问题,它会自动加密;问题在于旧数据。)
  • 我应该使用什么方法来处理此更新?哪些一般步骤是正确的?

这是一个普遍的Spring问题 - 当你需要改变生产中存在的结构并操纵旧数据以适应新格式时,你如何处理这种情况呢?

例如在PHP中,我使用与应用程序集成的终端脚本并在应用程序环境中运行(在Laravel中使用" artisan"命令);我可以轻松地创建一个正确的操作顺序:获取旧数据并记住它,更改数据库结构,操纵旧数据,并将数据插入新结构 - 它只需一个脚本和一个事务。我不知道如何在春天这样做。

1 个答案:

答案 0 :(得分:1)

我找到了答案 - 基于Flyway Java的迁移:https://flywaydb.org/documentation/migrations#java-based-migrations

  

基于Java的迁移非常适合所有使用SQL无法轻松表达的更改。这些通常是像BLOB& CLOB更改,高级批量数据更改(重新计算,高级格式更改,...)

看起来像这样:

package db.migration;

import org.flywaydb.core.api.migration.spring.SpringJdbcMigration;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * Example of a Spring Jdbc migration.
 */
public class V1_2__Another_user implements SpringJdbcMigration {
    public void migrate(JdbcTemplate jdbcTemplate) throws Exception {
        jdbcTemplate.execute("INSERT INTO test_user (name) VALUES ('Obelix')");
    }
}

数据库操作可以在这里与Java代码和数据操作交错。

我怀疑Liquibase具有类似的功能。