若依(springboot2.x)集成 liquibase

这么做的初衷是不想让团队成员在表结构的更改,seed 数据和 demo 数据的配置这块浪费时间,考虑到以前 OFBiz 的 entity engine 的功能,可以自定义字段,在启动时检查并更新数据库,于是就在朋友推荐下,找到了这个开源软件 liquibase,下面记录下使用过程。

liquibase 是什么,之类就不过多讲了,大家可以 Google 一下,很多,我用的是若依4.x 的开发脚手架,基于 springboot 2.x 的

  1. 添加依赖,我把它放在了 ruoyi-common 这个模块下,在模块的 pom.xml 中增加一个依赖

    <!-- 数据库版本管理工具 -->
    <dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
    </dependency>
  2. 编写配置类

package com.ruoyi.common.config;
import liquibase.integration.spring.SpringLiquibase;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;

@Configuration
public class LiquibaseConfig {
    @Bean
    public SpringLiquibase liquibase(DataSource dataSource) {
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setDataSource(dataSource);
        //指定changelog的位置,这里使用的一个master文件引用其他文件的方式
        liquibase.setChangeLog("classpath:/db/liquibase/changelog-master.xml");
        liquibase.setDropFirst(false);
        //liquibase.setContexts("development,test,production");
        liquibase.setShouldRun(true);
        return liquibase;
    }

}

3.按照配置类中的changelog 地址,编写 changelog 主文件(这里采用 include 的方式)

在 resources 目录下新建 db/liquibase/changelog/changelog-master.xml 这个文件作为主文件,内容是包含了 x 目录下所有的 changelog 文件

<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <includeAll path="db/liquibase/changelog/" relativeToChangelogFile="false"/>

</databaseChangeLog>

4.在 resources 目录里 db/liquibase/changelog/ 中,写接下来的所有的 changelog,例如我这里写了一个 init.xml 用于 ruoyi 初始化的数据库,sqlFile 即表示直接执行 sql,其他的语法请参阅文档。

<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <changeSet id="init-202010151055" author="wangyuliang">
        <sqlFile path="classpath:/db/sql/adfontes-fries.sql" encoding="UTF-8" />
    </changeSet>

</databaseChangeLog>

5.至此的话,liquibase 的配置在 springboot 中基本结束,但是在ruoyi 项目中,会有一些启动即开始加载的程序,比如一些系统参数 sysconfig 之类的,这样就会导致如果是第一次部署的话,则会先执行 sysconfig,再执行 liquibase,这样的话,是找不到数据库的。那么在查阅相关代码后,发现 ruoyi 中这些程序是加了  @PostConstruct 注解,这个注解是在bean 的构造函数之后,init 之前执行,在 ruoyi 中作为启动加载。

我这块的解决办法是,在这些需要启动加载的 class 上增加  @DependsOn("liquibase") 注解,这个表示当前 bean 的实例化是需要依赖 liquibase 的 bean,所以 liquibase 会优先启动,在第一次启动这个项目的时候,就会先执行 liquibase,后加载 sysconfig 数据

不确定我这种做法在后期会不会有坑,如果知道的朋友能指出错误,谢谢

站内相关文章:

Comment (2 )
如果您有不同的看法,或者疑问,欢迎指教