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

打印 上一主题 下一主题

主题 1013|帖子 1013|积分 3039


前言

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

一、功能概述



  • 自动维护DDL历史:首次利用时,系统会在数据库中创建一个名为ddl_history的表,用于记录每次实行的SQL脚本版本信息。
  • 机动的脚本实行:支持在差别的数据库之间切换数据源,并动态实行相应的脚本下令。
  • 企业级特性:这一功能被视为企业级的高级特性,而且是开源版本的一部分。
二、留意事项



  • 当实行DDL操纵时,假如脚本中包含切换数据源以创建数据库的操纵,可能会遇到非常。办理方法是,在切换到差别的数据库后,动态实行脚本下令。
三、代码示例

以下是一个利用MyBatis-Plus自动维护DDL的Java组件示例:
  1. @Component
  2. public class MysqlDdl implements IDdl {
  3.     /**
  4.      * 获取要执行的SQL脚本文件列表
  5.      */
  6.     @Override
  7.     public List<String> getSqlFiles() {
  8.         return Arrays.asList(
  9.                 "db/tag-schema.sql",
  10.                 // 从`3.5.3.2`版本开始,支持执行存储过程。在文件名后追加`#$$`,其中`$$`是自定义的完整SQL分隔符。
  11.                 // 存储过程脚本以`END`结尾,并追加分隔符`END;$$`表示脚本结束。
  12.                 "db/procedure.sql#$$",
  13.                 "D:\\db\\tag-data.sql"
  14.         );
  15.     }
  16. }
  17. // 切换到mysql从库,执行SQL脚本
  18. ShardingKey.change("mysqlt2");
  19. ddlScript.run(new StringReader("DELETE FROM user;\n" +
  20.         "INSERT INTO user (id, username, password, sex, email) VALUES\n" +
  21.         "(20, 'Duo', '123456', 0, 'Duo@baomidou.com');"));
复制代码
在这个示例中,我们定义了一个MysqlDdl组件,它实现了IDdl接口,并提供了要实行的SQL脚本文件列表。通过调用ShardingKey.change方法,我们可以切换到mysql的从库,并利用ddlScript.run方法实行特定的SQL脚本。
四、实战

1. 预备

tag-schema.sql
  1. -- ----------------------------
  2. -- Table structure for user
  3. -- ----------------------------
  4. DROP TABLE IF EXISTS `file`;
  5. CREATE TABLE `file`  (
  6.                          `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
  7.                          `file_path` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '文件路径',
  8.                          `file_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件名',
  9.                          `file_size` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '文件大小',
  10.                          `file_type` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '文件类型',
  11.                          `tenant_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '租户ID',
  12.                          `create_time` datetime(0) NOT NULL COMMENT '创建时间',
  13.                          `update_time` datetime(0) NOT NULL COMMENT '修改时间',
  14.                          PRIMARY KEY (`id`) USING BTREE
  15. ) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '文件表' ROW_FORMAT = Dynamic;
复制代码
tag-data.sql
  1. -- ----------------------------
  2. -- Records of user
  3. -- ----------------------------
  4. 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');
  5. 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配置类

  1. package org.example.springboot3.mybatisplus.config;
  2. import com.baomidou.mybatisplus.extension.ddl.IDdl;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Component;
  5. import javax.sql.DataSource;
  6. import java.util.Arrays;
  7. import java.util.List;
  8. import java.util.function.Consumer;
  9. /**
  10. * Create by zjg on 2024/7/2
  11. */
  12. @Component
  13. public class MysqlDdl implements IDdl {
  14.     @Autowired
  15.     private DataSource dataSource;
  16.     @Override
  17.     public void runScript(Consumer<DataSource> consumer) {
  18.         consumer.accept(this.dataSource);
  19.     }
  20.     @Override
  21.     public List<String> getSqlFiles() {
  22.         return Arrays.asList(
  23.                 "db/tag-schema.sql",
  24.                 "db/tag-data.sql"
  25.         );
  26.     }
  27. }
复制代码
3. 程序启动


4. 结果(数据库)




总结

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表