【第17章】MyBatis-Plus自动维护DDL

文章目录


前言

在MyBatis-Plus的3.5.3+版本中,引入了一项强大的功能:数据库DDL(数据定义语言)表结构的自动维护。这一功能通过执行SQL脚本来实现数据库模式的初始化和升级,与传统的flyway工具相比,它不仅支持分表库,还能够控制代码执行SQL脚本的过程。


一、功能概述

  • 自动维护DDL历史:首次使用时,系统会在数据库中创建一个名为ddl_history的表,用于记录每次执行的SQL脚本版本信息。
  • 灵活的脚本执行:支持在不同的数据库之间切换数据源,并动态执行相应的脚本命令。
  • 企业级特性:这一功能被视为企业级的高级特性,并且是开源版本的一部分。

二、注意事项

  • 当执行DDL操作时,如果脚本中包含切换数据源以创建数据库的操作,可能会遇到异常。解决方法是,在切换到不同的数据库后,动态执行脚本命令。

三、代码示例

以下是一个使用MyBatis-Plus自动维护DDL的Java组件示例:

java 复制代码
@Component
public class MysqlDdl implements IDdl {

    /**
     * 获取要执行的SQL脚本文件列表
     */
    @Override
    public List<String> getSqlFiles() {
        return Arrays.asList(
                "db/tag-schema.sql",
                // 从`3.5.3.2`版本开始,支持执行存储过程。在文件名后追加`#$$`,其中`$$`是自定义的完整SQL分隔符。
                // 存储过程脚本以`END`结尾,并追加分隔符`END;$$`表示脚本结束。
                "db/procedure.sql#$$",
                "D:\\db\\tag-data.sql"
        );
    }
}

// 切换到mysql从库,执行SQL脚本
ShardingKey.change("mysqlt2");
ddlScript.run(new StringReader("DELETE FROM user;\n" +
        "INSERT INTO user (id, username, password, sex, email) VALUES\n" +
        "(20, 'Duo', '123456', 0, 'Duo@baomidou.com');"));

在这个示例中,我们定义了一个MysqlDdl组件,它实现了IDdl接口,并提供了要执行的SQL脚本文件列表。通过调用ShardingKey.change方法,我们可以切换到mysql的从库,并使用ddlScript.run方法执行特定的SQL脚本。

四、实战

1. 准备

tag-schema.sql

sql 复制代码
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `file`;
CREATE TABLE `file`  (
                         `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
                         `file_path` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '文件路径',
                         `file_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件名',
                         `file_size` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '文件大小',
                         `file_type` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '文件类型',
                         `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '租户ID',
                         `create_time` datetime(0) NOT NULL COMMENT '创建时间',
                         `update_time` datetime(0) NOT NULL COMMENT '修改时间',
                         PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '文件表' ROW_FORMAT = Dynamic;

tag-data.sql

sql 复制代码
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `file` VALUES (1, '/data/nfs/file', 'a.jpeg', '123', 'jpeg', '1', '2024-05-23 20:53:27', '2024-05-31 21:47:15');
INSERT INTO `file` VALUES (2, '/data/nfs/file', 'b.png', '456', 'png', '2', '2024-06-10 13:53:50', '2024-06-20 20:58:23');

2. ddl配置类

java 复制代码
package org.example.springboot3.mybatisplus.config;

import com.baomidou.mybatisplus.extension.ddl.IDdl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

/**
 * Create by zjg on 2024/7/2
 */
@Component
public class MysqlDdl implements IDdl {
    @Autowired
    private DataSource dataSource;
    @Override
    public void runScript(Consumer<DataSource> consumer) {
        consumer.accept(this.dataSource);
    }

    @Override
    public List<String> getSqlFiles() {
        return Arrays.asList(
                "db/tag-schema.sql",
                "db/tag-data.sql"
        );
    }
}

3. 程序启动

4. 效果(数据库)


总结

回到顶部

通过这种方式,MyBatis-Plus提供了一个高效且自动化的方式来管理数据库的DDL操作,极大地简化了数据库结构的管理和维护工作。

相关推荐
长不大的杨瑞杰13 分钟前
OpenCode v2 LSP 实战:内置语言服务器、自定义配置与诊断闭环
java·人工智能·typescript·lsp·opencode
云和数据.ChenGuang18 分钟前
python和java的try
java·开发语言·python
日日大王学编程19 分钟前
阿里巴巴开源 Data Agent(Text2SQL)项目全维度详解
java·ai·开源
Wang's Blog23 分钟前
Java 项目实战:交友项目 - 交友左滑右滑
java·交友
测试盐25 分钟前
spark作业日志定位过程
java·hadoop·spark
ly768929 分钟前
从 OpenAPI 到多语言 SDK 生成:Java 服务端契约漂移与生成器版本治理
java·开发语言·openapi·java 21·版本兼容·契约漂移·sdk 生成
lqbzlll42 分钟前
CVE-2026-91403 排查指南:Java JSSE 信任链漏洞的根因、影响范围和修复步骤
java·开发语言·信任链
CarIise1 小时前
AOP 概念的引入
java·开发语言
Decay__1 小时前
01_MySQL 体系架构全解 —— 连接层、SQL 层、存储引擎层与 InnoDB 深入
运维·数据库·sql·mysql·架构
重生之我是Java开发战士1 小时前
【Redis】Java & JavaSpring 客户端
java·redis·bootstrap