日常开发中,需要进行数据库设计建模,创建对应的表,可通过liquibase脚本自动生成数据库表,减少开发时间。
1.项目中pom文件引入liquibase的maven依赖
<!-- liquibase start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
<!-- liquibase end -->
2.resource目录下创建liquibase的changelog目录以及主配置文件
- resource目录下创建liquibase目录、二级目录changelog
- 添加主配置文件master.xml,指定path为changelog下sql配置文件,如下所示
<?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.8.xsd">
<includeAll path="liquibase/changelog/" relativeToChangelogFile="false" />
</databaseChangeLog>
- changelog下创建数据库脚本文件xml,如liquibase_demo.xml,命名建议以相关的业务命名,不重复即可。注意,changeSet标签的id值一定不能重复。 另外,建表语句以及字段变更可通过指定标签或sql语句的形式,如下所示。
<?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.8.xsd">
<changeSet id="20220316170600" author="stiffening">
<!-- 指定标签形式创建表 -->
<createTable tableName="DEPT" remarks="部门表">
<column name="ID" type="INT" remarks="部门ID">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="NAME" type="VARCHAR(50)" remarks="部门名称">
<constraints nullable="false"/>
</column>
<column name="ACTIVE" type="BOOLEAN" defaultValueBoolean="true" remarks="是否启用" />
</createTable>
<!-- sql语句形式创建表 -->
<sql>
CREATE TABLE IF NOT EXISTS `EMPLOYEE` (
`ID` VARCHAR(32) NOT NULL COMMENT '员工ID',
`NAME` VARCHAR(50) NOT NULL COMMENT '员工姓名',
`AGE` INT COMMENT '年龄',
`DEPT_ID` VARCHAR(32) NOT NULL COMMENT '所在部门',
PRIMARY KEY (`ID`)
) ENGINE = INNODB COMMENT = '员工表';
</sql>
</changeSet>
<!-- 指定标签添加字段 -->
<changeSet id="20220316180000" author="stiffening">
<addColumn tableName="DEPT">
<column name="CODE" type="VARCHAR(50)" remarks="部门编码">
<constraints nullable="true"/>
</column>
</addColumn>
</changeSet>
<!-- 指定标签删除字段 -->
<changeSet id="20220316190000" author="stiffening">
<dropColumn tableName="DEPT" columnName="CODE" />
</changeSet>
<!-- sql语句添加、修改、删除字段等 -->
<changeSet id="20220316191000" author="stiffening">
<sql>
ALTER TABLE `DEPT` MODIFY `NAME` VARCHAR(100) COMMENT '部门名称';
ALTER TABLE `DEPT` ADD COLUMN `CODE` VARCHAR(50) COMMENT '部门编码';
</sql>
</changeSet>
</databaseChangeLog>
- 引用sql文件目录(liquibase目录下的二级data目录),changelog下脚本文件配置sqlFile标签指定对应的sql文件,data目录下的放的是sql脚本文件,如下所示。
<?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.8.xsd">
<changeSet id="20220318183000" author="stiffening">-->
<sqlFile path="liquibase/data/init_member_level.sql" />
</changeSet>
</databaseChangeLog>
4.配置文件yml增加liquibase配置
application.yml增加liquibase相应配置,如下所示。
spring:
liquibase:
enabled: true
change-log: classpath:/liquibase/master.xml
总结:
- 通常情况下changelog中建议使用sql语句形式创建表以及新增、修改、删除字段等,使用标签形式复杂,不建议使用,另外data目录配置sql脚本的形式,一般是初始化默认数据的时候使用。
- 项目启动后数据库会自动生成changelog相关的两张表,启动建表报错时,可通过查看changelog的表排查问题。