Запустите MyBatis миграцию команду «вверх» при запуске приложения - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть настройка myBatis для моей учетной записи.Это с помощью команды migrate в командной строке (в Jenkins).Теперь я хочу интегрировать это с самим приложением (Spring boot).В настоящее время у меня есть разные sql-файлы с @Undo и up sql-кодом.

Итак, когда я запускаю загрузочное приложение Sping, я хочу запустить команду migrate up без изменения уже имеющихся у меня sql-файлов?Возможно ли это в MyBatis и Spring?

1 Ответ

1 голос
/ 26 апреля 2019

Это примерно MyBatis-Migrations , верно?
Spring Boot не предоставляет встроенную поддержку, однако, кажется, можно написать пользовательский DatabasePopulator.

Вот простая реализация.
Используется функция миграции Migrations .

import java.io.File;
import java.net.URL;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.ibatis.migration.ConnectionProvider;
import org.apache.ibatis.migration.FileMigrationLoader;
import org.apache.ibatis.migration.MigrationException;
import org.apache.ibatis.migration.operations.UpOperation;
import org.springframework.jdbc.datasource.init.DatabasePopulator;
import org.springframework.jdbc.datasource.init.ScriptException;
import org.springframework.jdbc.datasource.init.UncategorizedScriptException;

public class MyBatisMigrationsPopulator implements DatabasePopulator {
  private final DataSource dataSource;
  private final String scriptsDir;
  private final Properties properties;
  private final DatabaseOperationOption options;

  public MyBatisMigrationsPopulator(DataSource dataSource, String scriptsDir,
      Properties properties, DatabaseOperationOption options) {
    super();
    this.dataSource = dataSource;
    this.scriptsDir = scriptsDir;
    this.properties = properties;
    this.options = options;
  }

  @Override
  public void populate(Connection connection) throws SQLException, ScriptException {
    try {
      new UpOperation().operate(new DataSourceConnectionProvider(dataSource),
        createMigrationsLoader(), options, null);
    } catch (MigrationException e) {
      throw new UncategorizedScriptException("Migration failed.", e.getCause());
    }
  }

  protected FileMigrationLoader createMigrationsLoader() {
    URL url = getClass().getClassLoader().getResource(scriptsDir);
    File dir = new File(url.getFile());
    return new FileMigrationLoader(dir, "utf-8", properties);
  }
}

Пример определения компонента DataSourceInitializer:

@Bean
public DataSourceInitializer dataSourceInitializer(DataSource dataSource) {
  // the directory that contains SQL scripts
  String scriptsDir = "scripts";
  String CHANGELOG_TABLE = "databaseChangelog";
  Properties properties = new Properties();
  properties.setProperty("changelog", CHANGELOG_TABLE);
  DatabaseOperationOption options = new DatabaseOperationOption();
  options.setChangelogTable(CHANGELOG_TABLE);
  MyBatisMigrationsPopulator populator = 
    new MyBatisMigrationsPopulator(dataSource, scriptsDir, properties, options);
  DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
  dataSourceInitializer.setDataSource(dataSource);
  dataSourceInitializer.setDatabasePopulator(populator);
  return dataSourceInitializer;
}

Вот исполняемый файл демонстрационный проект .
Возможно, вам потребуется изменить настройки источника данных в application.properties.

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

...