3.5 springboot与liquibase整合

2017-06-11 13:47:09 18,887 2

springboot内置了对liquibase整合的支持,我们只需要在项目中引入liquibase的依赖,进行配置即可。

pom.xml

<parent >
    <groupId> org.springframework.boot </groupId >
    <artifactId> spring-boot-starter-parent </artifactId>
    <version>1.4.1.RELEASE</version>
</parent >
<dependencies>
    <!--liquibase依赖-->
    <dependency>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-core</artifactId>
        <version>3.5.3</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.0.24</version>
    </dependency>
    <!--测试依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
       <groupId> org.springframework.boot </groupId >
       <artifactId> spring-boot-starter-web </artifactId>
    </dependency>
</dependencies>

application.yml

liquibase:
  change-log: classpath:liquibase/master.xml
  user: root
  password: <your password>
  url: jdbc:mysql://localhost:3306/test
  enabled: true
  drop-first: false

classpath:liquibase/master.xml

<?xml version="1.0" encoding="utf-8"?>
<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.4.xsd">

    <include file="classpath:liquibase/change_log/2017-06-10-init-schema.xml" relativeToChangelogFile="false"/>

</databaseChangeLog>

classpath:liquibase/change_log/2017-06-10-init-schema.xml

<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.4.xsd">
    <property name="autoIncrement" value="true" dbms="mysql"/>
    <changeSet id="init-schema" author="tianshouzhi" >
            <comment>init schema</comment>
        <createTable tableName="user">
            <column name="id" type="bigint" autoIncrement="${autoIncrement}">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="nick_name" type="varchar(255)">
                <constraints  nullable="false"/>
            </column>
            <column name="email" type="varchar(255)">
                <constraints  nullable="false"/>
            </column>
            <column name="register_time" type="timestamp"  defaultValueComputed="CURRENT_TIMESTAMP">
                <constraints nullable="false"/>
            </column>
        </createTable>

        <modifySql dbms="mysql">
            <append value="ENGINE=INNODB DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci"/>
        </modifySql>
    </changeSet>
</databaseChangeLog>

主类com.tianshouzhi.site.Application

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

启动程序后,我们就会发现数据库中的表已经建好。

QQ截图20170611132933.png

除此之外,我们还可以通过自己创建SpringLiquibase的方式,来执行change-log文件中的内容。

@Configuration
@EnableConfigurationProperties(LiquibaseProperties.class)
public class DataSourceConfig {
    @Bean
    public DataSource dragonHADataSource() throws Exception {
        return new DragonHADatasourceBuilder().build("dragon/dragon-ha-config.xml");
    }
    @Bean
    public SpringLiquibase liquibase(DataSource dataSource, LiquibaseProperties liquibaseProperties) throws Exception{
        SpringLiquibase liquibase=new SpringLiquibase();
        liquibase.setDataSource(dataSource);
        liquibase.setChangeLog(liquibaseProperties.getChangeLog());
        liquibase.setShouldRun(liquibaseProperties.isEnabled());
        liquibase.setDropFirst(liquibaseProperties.isDropFirst());
        return liquibase;
    }
}

在这里我们为SpringLiquibase注入了一个数据源DragonHADataSource,这是笔者自己编写的一个读写分离数据源,感兴趣的读者可以参考:http://static.tianshouzhi.com/api/tutorials/dragon/361

SpringLiquibase实现InitializingBean接口,覆写了afterPropertiesSet()方法,这个方法是change-log文件处理的入口。