springboot引入liquibase

最近项目中用到了liquibase,有时间总结了一下,liquibase的使用。
引入依赖

		
			org.liquibase
			liquibase-core
		

在application.yml中加入路径配置、

 spring:
  liquibase:
    change-log: classpath:/db/changelog/db.changelog-master.xml
    changelog是LiquiBase用来记录数据库的变更,一般放在CLASSPATH下,然后配置到执行路径中。

changelog支持多种格式,主要有XML/JSON/YAML/SQL,其中XML/JSON/YAML除了具体格式语法不同,节点配置很类似,SQL格式中主要记录SQL语句。以下是xml和sql的配置实例
db.changelog-master.xml



    
        
            
                
            
            
                
            
            ...
        
    

liquibase支持sql,也可以通过数据库导出sql,我把创建表的语句和初始化数据分开放到两个sql文件中,利用标签引入




    
        
        
    


这样项目启东时会安顺序自动执行这两个sql文件里的sql
也可以命令行的形式生成changeLog,然后再集成到springboot中。
下载liquibase的安装包,解压到指定目录下;
springboot引入liquibase_第1张图片

通过generateChangeLog生成现有数据库的changeLog文件;

 liquibase --driver=com.mysql.jdbc.Driver --classpath=mysql-connector-java-5.1.27.jar --changeLogFile=./dbchangelog.xml --url="jdbc:mysql://localhost:3306/blog" --username=root --password=root generateChangeLog

不过generateChangeLog不支持以下功能:存储过程、函数以及触发器;
generateChangeLog命令默认只会创建数据库结构的变更日志文件,如果希望创建插入数据的变更日志文件,可以使用参数diffTypes,该参数包括如下可选项:

tables [DEFAULT]表
columns [DEFAULT] 列
views [DEFAULT] 视图
primaryKeys [DEFAULT] 主键
indexes [DEFAULT] 索引
foreignKeys [DEFAULT]
sequences [DEFAULT]

有效文件管理
使用Liquibase中提供tag,可以将ChangeSet分布在不同文件中。同时支持多级引用。
基于此功能可以对项目中的ChangeSet进行有效管理。推荐使用以下规范进行管理。

  • 每个发布新建一个文件夹,所有发布相关的ChangeSet文件以及数据初始化文件,均放在些文件夹中。

  • 每个发布新建一个master.xml。此master.xml中,include本次发布需要执行的ChangeSet文件

  • 根据开发小组独立ChangeSet文件(可选)

  • 根据功能独立ChangeSet文件。例如user.xml, company.xml
    springboot引入liquibase_第2张图片
    Spring Boot中Liquibase默认是如何执行

  • 在启动时,LiquibaseAutoConfiguration会根据默认配置初始化SpringLiquibase

  • SpringLiquibase.afterPropertiesSet()中执行ChangeSet文件

  • 第一次跑ChangeSets的时候,会在数据库中自动创建两个表databasechangelog和databasechangeloglock
    引入多模块管理时基于上节文件管理规范,我们基于模块管理再做下调整。
    springboot引入liquibase_第3张图片
    当有一天我们需要把订单模块拆分成独立服务时,我们只需要将模块相关的ChangeSet文件迁出来。即可完成数据结构的拆分。

Spring Boot运行多个SpringLiquibase

禁用Spring Boot自动运行Liquibase。
当以下配置被启用时,Spring Boot AutoConfigure会使用默认配置初始化名为springLiquibase的Bean。然后我们不对其进行配置,Spring Boot启动时会报错。

# application.properties
# spring boot 2以上
spring.liquibase.enabled=false
# spring boot 2以下
liquibase.enabled=false

Spring Boot配置Liquibase Bean
配置两个SpringLiquibase Bean,Bean名称分别为userLiquibase和orderLiqubase。

@Configuration
public class LiquibaseConfiguration() {

    /**
     *  用户模块Liquibase   
     */
    @Bean
    public SpringLiquibase userLiquibase(DataSource dataSource) {
        SpringLiquibase liquibase = new SpringLiquibase();
        // 用户模块Liquibase文件路径
        liquibase.setChangeLog("classpath:liquibase/user/master.xml");
        liquibase.setDataSource(dataSource);
        liquibase.setShouldRun(true);
        liquibase.setResourceLoader(new DefaultResourceLoader());
        // 覆盖Liquibase changelog表名
        liquibase.setDatabaseChangeLogTable("user_changelog_table");
        liquibase.setDatabaseChangeLogLockTable("user_changelog_lock_table");
        return liquibase;
    }
    /**
     *  订单模块Liquibase   
     */
    @Bean
    public SpringLiquibase orderLiquibase() {
      SpringLiquibase liquibase = new SpringLiquibase();
      liquibase.setChangeLog("classpath:liquibase/order/master.xml");
      liquibase.setDataSource(dataSource);
      liquibase.setShouldRun(true);
      liquibase.setResourceLoader(new DefaultResourceLoader());
      liquibase.setDatabaseChangeLogTable("order_changelog_table");
      liquibase.setDatabaseChangeLogLockTable("order_changelog_lock_table");
      return liquibase;
    }
}

你可能感兴趣的:(springboot)