liquibase实战
简介
liquibase是一个用于跟踪、管理和应用数据库变化的开源数据库工具,它将所有数据库的变化保存在xml文件内,方便版本控制,避免开发人员或实施人员手动数据库管理升级等造成的一系列问题。
使用过Microsoft EF6的同学会很清楚这种工具的好处(EF6用在.NET框架中),没用过当我没说过就可以了。
初始化项目
这里使用一个简单的web项目进行演示。
更改配置
- 添加依赖
<!-- 日志文件管理包 -->
<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
完整项目结构图
启动项目自动创建user表
数据库中成功创建了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解压到本地
下载地址,注意下图中是我已包含数据库驱动和生成的配置文件。
- 添加数据库驱动生成备份配置
把mysql-connector-java-5.1.38-bin.jar拷贝到文件夹内,cmd进入当前文件夹,执行生成脚本。
数据库结构生成init-table.xml
- 下载liquibase解压到本地
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
- 转载请注明出处
- 请小编喝茶~