本文最后更新于: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
labels: release_1.0 contexts: dev
|
其他文件
db/changelog/db.change-master.yaml
1 2 3 4 5
| databaseChangeLog: - includeAll: path: classpath:/db/migration/ 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
|
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 '逻辑删除' );
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 '角色名' );
CREATE TABLE IF NOT EXISTS sys_user_role ( user_id BIGINT COMMENT '用户ID', role_id BIGINT COMMENT '角色ID' );
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 '逻辑删除' );
CREATE TABLE IF NOT EXISTS sys_role_menu ( role_id BIGINT COMMENT '角色ID', menu_id BIGINT COMMENT '菜单ID' );
|
注意事项
liquibase
在项目启动后会在数据库创建对应的两个表:
databasechangelog
:用来记录sql
文件执行信息。例如:当执行过V1_InitDatabase.sql
后,若修改此文件内容,可能会因与数据库记录的已执行文件信息不一致而报错。若仅是测试学习,可直接将对应的记录信息删除,让其重新记录。所以尽量确认无误后,再启动项目执行。
databasechangeloglock
:用来锁定