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

文章目录


前言

MyBatis-Plus3.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操作,极大地简化了数据库结构的管理和维护工作。

相关推荐
Frostnova丶4 小时前
LeetCode 190.颠倒二进制位
java·算法·leetcode
寂寞旅行5 小时前
向量数据库Milvus的使用
数据库·milvus
闻哥5 小时前
Redis事务详解
java·数据库·spring boot·redis·缓存·面试
hrhcode5 小时前
【Netty】五.ByteBuf内存管理深度剖析
java·后端·spring·springboot·netty
道亦无名5 小时前
aiPbMgrSendAck
java·网络·数据库
发现你走远了6 小时前
Windows 下手动安装java JDK 21 并配置环境变量(详细记录)
java·开发语言·windows
心 -6 小时前
java八股文DI
java
黎雁·泠崖6 小时前
Java常用类核心详解(一):Math 类超细讲解
java·开发语言
大尚来也6 小时前
跨平台全局键盘监听实战:基于 JNativeHook 在 Java 中捕获 Linux 键盘事件
java·linux
追随者永远是胜利者6 小时前
(LeetCode-Hot100)15. 三数之和
java·算法·leetcode·职场和发展·go