liquibase使用教程
在项目中引入liquibase过程:
1、父项目 pom.xml 中添加依赖
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>3.5.5</version>
</dependency>
</dependencies>
2、添加liquibase.properties文件
#liquibase
changeLogFile=src/main/resources/liquibase/db.changelog-master.xml
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
username=root
password=egova
3、父项目 pom中添加liquibase插件
<build>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<!--properties文件路径,该文件记录了数据库连接信息等-->
<propertyFile>src/main/resources/liquibase.properties</propertyFile>
<propertyFileWillOverride>true</propertyFileWillOverride>
<!--生成文件的路径-->
<outputChangeLogFile>src/main/resources/liquibase/changelog_dev.xml</outputChangeLogFile>
<!-- <driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8</url>
<username>root</username>
<password>egova</password>-->
</configuration>
</plugin>
</plugins>
</build>
4、新建changelog主文件入口: db.changelog-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.1.xsd"> <include file="src/main/resources/liquibase/changelog_dev.xml"/>
<!-- <include file="com/example/db/changelog/db.changelog-1.1.xml"/>
<include file="com/example/db/changelog/db.changelog-2.0.xml"/>-->
</databaseChangeLog>
5、打开maven命令框:可以选择模块

6、生成changelog
liquibase:generateChangeLog
(1) 对当前数据库状态生成 changlog:
mvn liquibase:generateChangeLog
(2)只对数据生成 changelog ,(先用别的方式往数据库创建数据后再用此方式生成changelog)
mvn liquibase:generateChangeLog -Dliquibase.diffTypes=data
区别:前者是在changelog中追加表创建语句,生成建表语句和数据插入语句,如果表语句已存在,则只生成建表语句:如图
<?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: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/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
<changeSet author="zhaoyanhao" id="1565662890214-1" objectQuotingStrategy="QUOTE_ALL_OBJECTS">
<createTable tableName="test1">
<column name="id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="name" type="VARCHAR(15)">
<constraints nullable="false"/>
</column>
<column name="email" type="VARCHAR(100)">
<constraints nullable="false"/>
</column>
<column name="password" type="VARCHAR(8)">
<constraints nullable="false"/>
</column>
<column name="phone" type="VARCHAR(50)">
<constraints nullable="false"/>
</column>
<column name="address" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="description" type="LONGTEXT"/>
<column defaultValueComputed="CURRENT_TIMESTAMP" name="create_time" type="TIMESTAMP">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
<changeSet author="zhaoyanhao" id="1565662890214-2" objectQuotingStrategy="QUOTE_ALL_OBJECTS">
<addPrimaryKey columnNames="id" constraintName="PRIMARY" tableName="test1"/>
</changeSet>
<changeSet author="zhaoyanhao" id="1565662890214-3" objectQuotingStrategy="QUOTE_ALL_OBJECTS">
<createTable tableName="test2">
<column name="id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="name" type="VARCHAR(15)">
<constraints nullable="false"/>
</column>
<column name="password" type="VARCHAR(8)">
<constraints nullable="false"/>
</column>
<column name="phone" type="VARCHAR(50)">
<constraints nullable="false"/>
</column>
<column name="address" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="description" type="LONGTEXT"/>
<column defaultValueComputed="CURRENT_TIMESTAMP" name="create_time" type="TIMESTAMP">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
<changeSet author="zhaoyanhao" id="1565662890214-4" objectQuotingStrategy="QUOTE_ALL_OBJECTS">
<addPrimaryKey columnNames="id" constraintName="PRIMARY" tableName="test2"/>
</changeSet>
</databaseChangeLog>
7、执行changelog,写入数据库
在changeset中添加createTable语句,执行liquibase,使用命令:
liquibase:update 将changelog变化的内容写入数据库
liquibase:updateSQL 检查changelog语法的合法性
8、在项目中使用liquibase
@Bean
public SpringLiquibase liquibase(DataSource dataSource, LiquibaseProperties liquibaseProperties) { SpringLiquibase liquibase = new SpringLiquibase(taskExecutor, env);
liquibase.setDataSource(dataSource);
//制定changelog的位置,这里使用的一个master文件引用其他文件的方式
liquibase.setChangeLog("classpath:config/liquibase/db.changelog-master.xml");
liquibase.setContexts(liquibaseProperties.getContexts());
liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema());
liquibase.setDropFirst(liquibaseProperties.isDropFirst());
return liquibase;
}
第三方调用liquibase可以参考:https://blog.csdn.net/weixin_34087307/article/details/91397914
liquibase命令大全
| 命令名称 | 命令描述 |
|---|---|
| update | 更新数据库到当前版本 |
| updateSQL | 写入SQL将数据库更新到currentversion或STDOUT |
| updateCount <num> | 将下一个NUM更改应用到数据库 |
| updateCountSQL <num> | 写入SQL以将下一个NUM更改应用到数据库 |
| updateToTag <tag> | 使用指定的标记将数据库更新到变更集 |
| updateToTagSQL <tag> | 使用指定的标记将SQL写入(到标准输出)到更改集 |
| rollback <tag> | 将数据库回滚到指定标签的状态is was |
| rollbackSQL <tag> | 生成数据库回滚到指定标签的sql |
| rollbackToDate <date/time> | 将数据库回滚到给定日期/时间的状态is was。日期格式:yyyy-MM-dd 'HH: mm: ss |
| rollbackToDateSQL <date/time> | 写入SQL以将数据库回滚到给定日期/时间版本的状态到STDOUT |
| rollbackCount <value> | 回滚应用于数据库的最后一个<值>更改集 |
| rollbackCountSQL <value> | 写入SQL以回滚最后一个<值>更改集到应用于数据库的stdoutapply |
| futureRollbackSQL | 写入SQL,以便在更改日志中的更改完成后将数据库回滚到当前状态 |
| futureRollbackSQL <value> | 在更改日志中的<值>更改完成后,写入SQL以将数据库回滚到当前状态 |
| futureRollbackFromTagSQL <tag> | 写入(到标准输出)SQL,以便在更改后将数据库回滚到其当前状态 |
| updateTestingRollback | 更新数据库,然后再次回滚更改。用于测试回滚支持 |
| generateChangeLog | 写入更改日志XML以将数据库的当前状态复制到标准输出 |
| snapshot | 将数据库的当前状态写入标准输出 |
| snapshotReference | 将referenceUrl数据库的当前状态写入标准输出 |
| Diff Commands | 数据库对比命令 |
| diff [diff parameters] | 数据库对比命令 |
| diffChangeLog [diff parameters] | 数据库对比日志 |
| Documentation Commands | 文档命令 |
| dbDoc <outputDirectory> | 基于当前数据库和更改日志生成类似javadoc的文档 |
| Maintenance Commands | 维护命令 |
| tag <tag string> | 给当前的数据库打标签,方便日后回滚 |
| tagExists <tag string> | 检查对应的标签是否存在 |
| status [--verbose] | 输出为执行changeset的行数 |
| unexpectedChangeSets[--verbose] | 输出本地不存在changeset 行数 |
| validate | 检查是否有错误的changelog |
| calculateCheckSum <id> | 检查指定changeset id 的checksum值 格式为 filepath::id::author |
| clearCheckSums | 从数据库日志中删除所有保存的校验和 |
| changelogSync | 标记所有的更改已执行 |
| changelogSyncSQL | 生成标记更改已执行的sql并输出到标准输出 |
| markNextChangeSetRan | 将下一个变更标记为已执行 |
| markNextChangeSetRanSQL | 生成将下一个变更标记为已执行的sql并输出到标准输出 |
| listLocks | 列出liquibase数据库锁 |
| releaseLocks | 释放所有的liquibase数据库锁 |
| dropAll | 删除数据库表(慎用!) |
liquibase使用教程的更多相关文章
- Spirng Boot2 系列教程(二十二)| 启动原理
一个读者,也是我的好朋友投稿的一篇关于 SpringBoot 启动原理的文章,才大二就如此优秀,未来可期. 我一直想了解一下 SpirngBoot 的是如何启动的,我想就来写一篇关于 SpirngBo ...
- Spring Boot2 系列教程(二十一) | 自动配置原理
微信公众号:一个优秀的废人.如有问题,请后台留言,反正我也不会听. 前言 这个月过去两天了,这篇文章才跟大家见面,最近比较累,大家见谅下.下班后闲着无聊看了下 SpringBoot 中的自动配置,把我 ...
- SpringBoot教程——检视阅读
SpringBoot教程--检视阅读 参考 SpringBoot教程--一点--蓝本--springboot2.1.1 SpringBoot教程--易百--springboo2.0.5.RELEASE ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- Angular2入门系列教程1-使用Angular-cli搭建Angular2开发环境
一直在学Angular2,百忙之中抽点时间来写个简单的教程. 2016年是前端飞速发展的一年,前端越来越形成了(web component)组件化的编程模式:以前Jquery通吃一切的田园时代一去不复 ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
随机推荐
- bugku-杂项 convert
打开题目文件,一大堆01码,用py转换成hex f=open("in.txt","r") print hex(int(str(f.read()),2)) f.c ...
- 用Python在00:00给微信好友发元旦祝福语
2019年的元旦即将来临,这里用Python撸一串简单的代码来实现定点给微信里的所有小伙伴发祝福语 环境说明 Python版本: 不限 第三方库: itchat, schedule 注:所有祝福语来源 ...
- Ubuntu Kylin 14.04LTS 开机后卡在登陆界面,可以进入字符界面,或者登陆后鼠标不显示但是管用
2014年4月27日,距离中期检查还有七天,基本上什么也没做,特别着急,雨已经下了快一天了,中午用美团外卖定的黄焖排骨,MD,什么玩意,那么一点点就18块钱,一看就不值五块钱,发誓再也不吃,最重要的是 ...
- [前端] VUE基础 (9) (element-ui、axios、Vuex)
一.element-ui的使用 官方网页:https://element.eleme.cn/#/zh-CN 1.安装element-ui (venv) D:\pycharm_workspace\vue ...
- 【2017西安邀请赛:A】XOR(线段树+线性基)
前言:虽然已经有很多题解了,但是还是想按自己的理解写一篇. 思路:首先分析题目 一.区间操作 —— 线段树 二.异或操作 —— 线性基 这个两个不难想,关键是下一步的技巧 “或”运算 就是两个数的二进 ...
- 系统学习python第一天学习笔记
1.计算机认识 1.常见的操作系统 win xp win7 win10 window server(服务器) linux centos,图形化界面差 ubuntu , 个人开发(图形化比较好) red ...
- Java IO流操作 (II)
缓冲流 /* * BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符.数组和字符串的高效写入. * BufferedReader:从字符输入流中读取文本,缓冲各个字符, ...
- 开源PLM软件Aras详解八 Aras之RelationshipTypes关系类详解
在Aras中,在之前ItemType解析中有提到,Aras中实际ItemType对应的就是一张表,那么,ItemType与ItemType之间是如何关联的呢, 如果我们需要捋清楚ItemType与It ...
- Swagger注解及参数细节的正确书写。
今天新开了一个api文件,结果怎么搞也在swagger里显示不出来,浪费半天后,去问老员工了. 一般有俩原因, 1.idea缓存,重启idea即可. 2.注解和参数上的修饰有问题,或者请求method ...
- Object arrays cannot be loaded when allow_pickle=False
问题再现 代码是Deep Learning with Python中的: from keras.datasets import imdb (train_data, train_labels), (te ...