liquibase实战

简介

liquibase是一个用于跟踪、管理和应用数据库变化的开源数据库工具,它将所有数据库的变化保存在xml文件内,方便版本控制,避免开发人员或实施人员手动数据库管理升级等造成的一系列问题。
使用过Microsoft EF6的同学会很清楚这种工具的好处(EF6用在.NET框架中),没用过当我没说过就可以了。

初始化项目

这里使用一个简单的web项目进行演示。
initproject

更改配置

  • 添加依赖
<!--    日志文件管理包    -->
        <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>janino</artifactId>
            <version>${janino.version}</version>
        </dependency>

        <!--    JDBC    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!--    Mybatisplus依赖    -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
            <version>3.8.1</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- json -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>[2.9.10.1,)</version>
        </dependency>
  • 添加liquibase配置
    init-table.xml数据库建表配置
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.8.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
    <changeSet author="JIAY (generated)" id="1574053603125-1">
        <createTable tableName="user">
            <column name="Id" type="VARCHAR(36)">
                <constraints primaryKey="true"/>
            </column>
            <column name="Name" type="VARCHAR(50)"/>
            <column name="Age" type="INT"/>
        </createTable>
    </changeSet>
</databaseChangeLog>

changelog-master.xml数据库重构入口配置

<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<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.5.xsd">

    <!--relativeToChangelogFile=true则指changelog文件目录是相对根changelog而不是classpath-->
    <include file="classpath:liquibase/init-table.xml" relativeToChangelogFile="false"/>

</databaseChangeLog>
  • 添加配置文件
spring:
  profiles:
    active: dev
  liquibase:
    enabled: true
    change-log: "classpath:/liquibase/changelog-master.xml"
logging:
  level:
    org:
      springframework:
        boot:
          autoconfigure: ERROR

完整项目结构图
projectschema

启动项目自动创建user表

createtable
数据库中成功创建了user表。另外两个表是数据库操作记录表。

liquibase标签

  • 创建表
<changeSet id="3" author="jiay"> 
 <createTable tableName="user">
    <column name="Id" type="VARCHAR(36)">
        <constraints primaryKey="true"/>
    </column>
    <column name="Name" type="VARCHAR(50)"/>
    <column name="Age" type="INT"/>
 </createTable> 
</changeSet>
  • 添加列
<changeSet id="4" author="jiay"> 
 <addColumn tableName="user"> 
   <column name="phonenumber" type="varchar(15)"/> 
 </addColumn> 
</changeSet>
  • 删除列
<changeSet id="5" author="jiay"> 
 <dropColumn tableName="user" columnName="phonenumber"/> 
</changeSet>
  • 增加数据
<changeSet author="jiay" id="6">
    <insert tableName="user">
        <column name="Id" value="dcc0bfd3-09ba-11ea-af01-00ff9adab040"/>
        <column name="Name" value="jiay"/>
        <column name="Age" valueNumeric="20"/>
    </insert>
</changeSet>
  • 引入sql脚本
<changeSet id="7" author="jiay"> 
 <sqlFile path="insert-data.sql"/> 
</changeSet>

更多内容查看官方资料https://www.liquibase.org/quickstart.html

项目中引入liquibase

  • liquibase备份
    实际项目中大多数情况是数据库已经存在,需要做扩展升级。这时候可以手动把当前数据库进行liquibase备份,然后项目中引入。
    • 下载liquibase解压到本地
      下载地址,注意下图中是我已包含数据库驱动和生成的配置文件。
      reales
    • 添加数据库驱动生成备份配置
      把mysql-connector-java-5.1.38-bin.jar拷贝到文件夹内,cmd进入当前文件夹,执行生成脚本。
      数据库结构生成init-table.xml
liquibase --driver=com.mysql.jdbc.Driver --classpath=mysql-connector-java-5.1.38-bin.jar --changeLogFile=./init-table.xml --url="jdbc:mysql://localhost:3306/jiay" --username=root --password=jc1 generateChangeLog

数据库数据生成init-data.xml

liquibase --driver=com.mysql.jdbc.Driver --classpath=mysql-connector-java-5.1.38-bin.jar --changeLogFile=./init-data.xml --url="jdbc:mysql://localhost:3306/jiay?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true" --username=root --password=jc1 --diffTypes=data generateChangeLog

比较数据库差异生成changelog

liquibase \
--url=jdbc:mysql://localhost:3306/jiay \
--username=username \
--password=password \
--changeLogFile=changelog.xml 
diffChangeLog \
--referenceUrl=jdbc:mysql://localhost:3306/jiay2 \
--referenceUsername=username \
--referencePassword=password
  • 引入项目
    init-table.xml和init-data.xml或changelog.xml拷贝到liquibase文件夹内,然后就可以在changelog-master.xml中选则是否包含配置进行迁移或升级。
    • 新增列
      新建upgrade-table-user.xml包含到changelog-master.xml中
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.8.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
    <changeSet author="JIAY (generated)" id="1574125101032-1">
        <addColumn tableName="user">
            <column name="Tel" type="VARCHAR(15)"></column>
        </addColumn>
    </changeSet>
</databaseChangeLog>

运行代码自动更新了user表结构。

示例源码

https://github.com/Gladitor/liquibasedemo

欢迎来访

  • 有问题欢迎留言或加交流qq:825121848
  • 转载请注明出处
  • 请小编喝茶~
Last Updated: 4/16/2022, 11:05:56 AM