数据库初始化工具

本文最后更新于:2025年6月23日 晚上

数据库初始化工具

当需要在项目启动时,自动创建对应的数据库表结构和数据时。以前都是通过实现CommandLineRunner的子线程,通过调用编写的mapper文件执行对应的sql语句。但这样太繁琐了,所以今天就推荐liquibase来进行数据库初始化和sql文件的版本管理。

依赖

1
2
3
4
5
<!-- 用于初始化数据库表和数据 -->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
spring:
# 数据库正常配
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/security_auth?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
liquibase:
enabled: true
# 主变更日志文件
change-log: classpath:db/changelog/db.changelog-master.yaml
# 是否在更新时回滚
test-rollback-on-update: false

# 若label与contexts同时配置,则需要执行的sql标识全部匹配才会执行
labels: release_1.0 # 指定启用的sql标签,对应labels:release_1.0
contexts: dev # 指定启用的sql上下文环境,对应context:dev

其他文件

db/changelog/db.change-master.yaml

1
2
3
4
5
# db.changelog-master.yaml
databaseChangeLog:
- includeAll:
path: classpath:/db/migration/ # SQL 脚本存放目录
relativeToChangelogFile: false

sql文件目录:/db/migration/

V1_InitDatabase.sql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
-- liquibase formatted sql

-- changeset peter:1 labels:release_1.0 context:dev
-- comment: 初始化用户表
CREATE TABLE IF NOT EXISTS sys_user (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
username VARCHAR(255) NOT NULL COMMENT '用户名',
password VARCHAR(512) NOT NULL COMMENT '密码',
status TINYINT DEFAULT 0 NOT NULL COMMENT '状态',
version INTEGER DEFAULT 0 NOT NULL COMMENT '版本号',
is_deleted TINYINT DEFAULT 0 NOT NULL COMMENT '逻辑删除'
);
-- rollback DROP TABLE sys_user;

-- changeset peter:2 labels:release_1.0 context:dev
-- comment: 初始化角色表
CREATE TABLE IF NOT EXISTS sys_role (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '角色ID',
role_code VARCHAR(255) NOT NULL COMMENT '角色代码',
role_name VARCHAR(255) NOT NULL COMMENT '角色名'
);
-- rollback DROP TABLE sys_role;

-- changeset peter:3 labels:release_1.0 context:dev
-- comment: 初始化用户角色关系表
CREATE TABLE IF NOT EXISTS sys_user_role (
user_id BIGINT COMMENT '用户ID',
role_id BIGINT COMMENT '角色ID'
);
-- rollback DROP TABLE sys_user_role;

-- changeset peter:4 labels:release_1.0 context:dev
-- comment: 初始化菜单表
CREATE TABLE IF NOT EXISTS sys_menu (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '角色ID',
parent_id BIGINT NOT NULL COMMENT '父级菜单ID',
name VARCHAR(255) NOT NULL COMMENT '菜单名称',
type INTEGER NOT NULL COMMENT '菜单类型',
component VARCHAR(255) NOT NULL COMMENT '前端组件',
perms VARCHAR(255) COMMENT '权限标识',
icon VARCHAR(255) COMMENT '菜单图标',
sort_value INTEGER COMMENT '排序',
path VARCHAR(255) COMMENT '菜单路径',
status INTEGER NOT NULL COMMENT '菜单状态(0:禁止,1:正常)',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_time DATETIME NOT NULL COMMENT '更新时间',
is_deleted TINYINT DEFAULT 0 NOT NULL COMMENT '逻辑删除'
);
-- rollback DROP TABLE sys_menu;

-- changeset peter:5 labels:release_1.0 context:dev
-- comment: 初始化角色菜单关系表
CREATE TABLE IF NOT EXISTS sys_role_menu (
role_id BIGINT COMMENT '角色ID',
menu_id BIGINT COMMENT '菜单ID'
);
-- rollback DROP TABLE sys_role_menu;

注意事项

liquibase在项目启动后会在数据库创建对应的两个表:

databasechangelog:用来记录sql文件执行信息。例如:当执行过V1_InitDatabase.sql后,若修改此文件内容,可能会因与数据库记录的已执行文件信息不一致而报错。若仅是测试学习,可直接将对应的记录信息删除,让其重新记录。所以尽量确认无误后,再启动项目执行。

databasechangeloglock:用来锁定


数据库初始化工具
https://superlovelace.top/2025/06/23/liquibase初始化数据库/
作者
棱境
发布于
2025年6月23日
更新于
2025年6月23日
许可协议