SpringBoot整合liquibase及liquibase生成初始化脚本的方式
作者:露天窗 发布时间:2023-07-29 11:53:18
一. SpringBoot集成liquibase
项目集成liquibase作用
对数据库表字段进行版本控制
项目初始化部署时初始化数据库表和数据
①.导入pom依赖
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
②.配置application.yml文件,指定master.xml
spring:
liquibase:
change-log: classpath:liquibase/master.xml #指定master.xml文件的位置
不同spring版本配置方式不一样
具体看源码LiquibaseProperties中配置
③.新建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/init_table.xml" relativeToChangelogFile="false"/>
<include file="classpath:liquibase/change_log/init_data.xml" relativeToChangelogFile="false"/>
</databaseChangeLog>
④.将数据库表初始脚本init_table.xml和数据初始脚本init_data.xml放到项目目录下
脚本可以通过手写的方式或者通过liquibase自动生成;
启动项目如果第一次运行则会在数据库中创建表和数据
后面如果脚本中有新增表或者字段启动项目的时候也会自动创建生成
二. liquibase生成数据库表和数据的初始化脚本
liquibase有两种方式生成初始化脚本
方法一:在官网下载liquibase压缩包,使用原生的命令行指令来生成
下载liquibase压缩包,解压,将mysql连接jar包复制一份到此目录下
进入解压目录执行如下执行
根据数据库生成表结构文件
./liquibase --driver=com.mysql.cj.jdbc.Driver --classpath=mysql-connector-java-8.0.17.jar --changeLogFile=./init-data.xml --url="jdbc:mysql://192.168.0.162:3306/hello_world" --username=root --password=123456 --diffTypes=data generateChangeLog
根据数据库生成初始数据文件
./liquibase --driver=com.mysql.cj.jdbc.Driver --classpath=mysql-connector-java-8.0.17.jar --changeLogFile=./init-table.xml --url="jdbc:mysql://192.168.0.162:3306/hello_world" --username=root --password=123456 generateChangeLog
数据库驱动取决于数据库
–driver=com.mysql.cj.jdbc.Driver
mysql连接
–classpath=mysql-connector-java-8.0.17.jar
自定义生成的初始化脚本文件名
–changeLogFile=./init-data.xml
数据库连接地址
–url=“jdbc:mysql://192.168.0.162:3306/hello_world”
数据库用户名密码
-username=root
–password=123456
生成初始化表数据需要加上这个配置,生成表结构则不加
-diffTypes=data
方法二:使用Maven插件
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<changeLogFile>${basedir}/src/main/resources/liquibase/change_log/changelog.xml</changeLogFile>
<!--changelog文件生成位置-->
<outputChangeLogFile>${basedir}/src/main/resources/liquibase/change_log/changelog.xml</outputChangeLogFile>
<!--数据库连接-->
<driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://192.168.0.30:3306/school</url>
<username>qj</username>
<password>123456</password>
<!--输出文件编码-->
<outputFileEncoding>UTF-8</outputFileEncoding>
<!--执行的时候是否显示详细的参数信息-->
<verbose>true</verbose>
<!--连接非本地数据库是否弹出提示框-->
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
<!--生成changelog文件内容-->
<diffTypes>tables, views, columns, indexs,foreignkeys, primarykeys, uniqueconstraints, data</diffTypes>
</configuration>
</plugin>
如果只是生成数据库表脚本,则将上面的diffTypes注释起来或者去掉里面的data
如果只是生成数据脚本,则只留下data
如果要把数据表脚本和数据脚本生成到一个文件则保留上面的difftypes所有内容
安装好maven插件后maven插件中可以看如下图的指令,点击即可生成脚本文件
生成脚本如下
<?xml version="1.0" 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.4.xsd">
<changeSet author="404997819 (generated)" id="1590732067909-4">
<createTable tableName="t_student">
<column autoIncrement="true" name="studentId" remarks="学生自增ID" type="INT">
<constraints primaryKey="true"/>
</column>
<column name="classId" remarks="班级ID" type="INT"/>
<column name="userCode" remarks="用户唯一码" type="VARCHAR(20)"/>
<column name="studentName" remarks="学生姓名" type="VARCHAR(20)"/>
<column name="studentImageUrl" remarks="学生头像地址" type="VARCHAR(200)"/>
<column name="studentCode" remarks="学生学号" type="VARCHAR(50)"/>
<column name="IDCard" remarks="身份证号" type="VARCHAR(50)"/>
<column name="status" remarks="学生状态 1:在读 0:毕业 -1:转校" type="VARCHAR(5)"/>
<column name="flag" remarks="是否删除 1:正常显示,-1:表示删除" type="VARCHAR(10)"/>
<column name="createDate" remarks="创建时间" type="datetime"/>
</createTable>
</changeSet>
<changeSet author="404997819 (generated)" id="1590732067909-6">
<createTable tableName="t_teacherRelation">
<column autoIncrement="true" name="teacherRelationId" remarks="主键自增ID" type="INT">
<constraints primaryKey="true"/>
</column>
<column name="classId" remarks="班级ID" type="INT"/>
<column name="teacherId" remarks="教师ID" type="INT"/>
<column name="teacherType" remarks="教师类型 1:班主任" type="VARCHAR(10)"/>
<column name="flag" remarks="是否删除 1:正常显示,-1:表示删除" type="VARCHAR(10)"/>
<column name="createDate" remarks="创建时间" type="datetime"/>
</createTable>
</changeSet>
<changeSet author="404997819 (generated)" id="1590732067909-10">
<createIndex indexName="Reft_userinfo88" tableName="t_api_logs">
<column name="apiToken"/>
</createIndex>
</changeSet>
</databaseChangeLog>
参考文章如下
http://blog.jiunile.com/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7liquibase.html
https://blog.csdn.net/cover1231988/article/details/78124673?utm_source=blogxgwz5
https://www.cnblogs.com/tonyq/p/8039770.html
https://www.jianshu.com/p/07a45b6722fd
来源:https://blog.csdn.net/lutianchuang/article/details/106414796


猜你喜欢
- 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。深刻认识Stri
- RN的打包,大家可以根据官网一步一步来,但这里有几个地方注意,一下简单介绍:生成一个签名密钥在项目的目录下打开cmd命令窗口输入一下命令运行
- 本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下:简单描述最高位是符号位,始终为0,不可用。41位的时间序列,
- 众所周知Java中的数据类型是强数据类型,基本数据类型之间的转换尤其固定的规则,当数据宽度比较窄的数据类型(如int)转换成数据类型比较宽的
- 前言这篇博客学习下Mybatis操作中使用Redis做缓存。这里其实主要学习几个注解:@CachePut、@Cacheable、@Cache
- 我们在C#编程中常见的信息提示框(MessageBox)是微软NET自带的一个用于弹出警告、错误或者讯息一类的“模式”对话框。此类对话框一旦
- webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互。概念性的东西就不说太多,下面开始创建一个简单的webservi
- 本文实例为大家分享了C#导出Excel的具体代码,供大家参考,具体内容如下using System;using System.Collect
- 一、下载步骤首先明确自己的操作系统下载地址:点击跳转进入界面后我们可以看到有ultimate版本(收费)和community版本(免费),学
- 本文实例讲述了Android7.0上某些PopuWindow出现显示位置不正确问题的解决方法。分享给大家供大家参考,具体如下:情景描述:在a
- 多个条件使用Map传递参数进行批量删除1、使用场景因为项目需要针对资源文件(视频、音频、文档),编辑时候可能出现以下3种情况:实现的项目效果
- 前言相信对于RxJava,大家应该都很熟悉,他最核心的两个字就是异步,诚然,它对异步的处理非常的出色,但是异步绝对不等于并发,更不等于线程安
- 目录前言示例参考:前言按需加载对象延迟加载实际是推迟进行创建对象,直到对其调用后才进行创建初始化,延迟(懒加载)的好处是提高系统性能,避免不
- 前言前面我们已经分析Dubbo SPI相关的源码,看过的小伙伴相信已经知晓整个加载过程,我们也留下两个问题,今天我们先来处理下其中关于注解A
- 前言水波纹特效,想必大家或多或少见过,在我的印象中,大致有如下几种: 支付宝 "咻
- 下面一段代码给大家介绍了android 自定义顶部导航栏控件功能,具体代码如下所示:class HeaderBar @JvmOverload
- 在日常开发中经常遇到控件不能随着父容器大小的改变而且自动改变控件的所在位置和大小。以下是实现的代码 /// <summary>
- 之前一段时间,在朋友的推荐下,玩了探探这一款软件,初玩的时候,就发现,这款软件与一般的社交软件如陌陌之类的大相径庭,让我耳目一新,特别是探探
- 一般在使用RecyclerView的时候不免要修改RecyclerView的数据,使用notifyDataSetChanged()来刷新界面
- 本文实例为大家分享了Java Socket聊天室功能的具体代码,供大家参考,具体内容如下Client.javaimport java.io.