• SpringBoot+Mybatis实现代码获取建表语句并实现动态建表


    场景

    若依前后端分离版本地搭建开发环境并运行项目的教程:

    若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客_前后端分离项目本地运行

    在上面的框架的使用基础上,需要在代码中获取某个表的建表语句,并根据业务

    需求动态的建新的表。

    比如在定时任务中执行固定的代码,在代码中获取某个表的建表语句,然后以时间

    为后缀新建新的一个表。

    比如新建表:

    1. CREATE TABLE `bus_badao_record` (
    2. `id` int NOT NULL AUTO_INCREMENT,
    3. `x` varchar(255) DEFAULT NULL,
    4. `y` varchar(255) DEFAULT NULL,
    5. `record_time` datetime DEFAULT NULL,
    6. PRIMARY KEY (`id`)
    7. ) ENGINE=InnoDB DEFAULT charset=utf8mb3

    需要每天新建一个表并以时间为后缀,比如明天需要新建一个表bus_badao_record20220805,后天需要新建一个表bus_badao_record20220806

    注:

    博客:
    霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    1、 首先按照上面的建表语句在Mysql中建立该表。

    需要用到Mysql中的查看建表语句的sql

    show create table bus_badao_record

    后面跟的是表名。

    在Navicat中执行的结果是

    会返回两个字段,一个是table表名,一个是create table的内容。

    所以针对返回的内容,在SpringBoot中新建实体类TableInfo

    1. package com.ruoyi.quartz.domain;
    2. public class TableInfo {
    3. private String table;
    4. private String createTable;
    5. public String getTable() {
    6. return table;
    7. }
    8. public void setTable(String table) {
    9. this.table = table;
    10. }
    11. public String getCreateTable() {
    12. return createTable;
    13. }
    14. public void setCreateTable(String createTable) {
    15. this.createTable = createTable;
    16. }
    17. }

    2、针对该实体类新建Mapper接口

    1. package com.ruoyi.quartz.mapper;
    2. import com.ruoyi.quartz.domain.TableInfo;
    3. import org.apache.ibatis.annotations.Mapper;
    4. import org.apache.ibatis.annotations.Param;
    5. import java.util.List;
    6. @Mapper
    7. public interface BusTableMapper {
    8. public int createTableSql(String sql);
    9. public TableInfo showCreateTable(String sql);
    10. }

    对应mapper.xml的文件内容

    1. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    2. <mapper namespace="com.ruoyi.quartz.mapper.BusTableMapper">
    3. <resultMap id="TableInfoResult" type="com.ruoyi.quartz.domain.TableInfo">
    4. <result property="table" column="Table"/>
    5. <result property="createTable" column="Create Table"/>
    6. resultMap>
    7. <update id="createTableSql" parameterType="int">
    8. ${sql}
    9. update>
    10. <select id="showCreateTable" resultMap="TableInfoResult" parameterType="string">
    11. ${sql}
    12. select>
    13. mapper>

    将Create Table字段的返回值映射到createTable字段。

    3、这里定时任务使用的若依集成的quartz实现,在定时任务的具体实现类中

    1. package com.ruoyi.quartz.task;
    2. import com.ruoyi.quartz.constants.TableConstant;
    3. import com.ruoyi.quartz.domain.TableInfo;
    4. import com.ruoyi.quartz.mapper.BusTableMapper;
    5. import org.apache.commons.lang3.time.DateUtils;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.scheduling.annotation.Scheduled;
    8. import org.springframework.stereotype.Component;
    9. import java.text.SimpleDateFormat;
    10. import java.util.Date;
    11. //动态创建表定时任务
    12. @Component("createTableTask")
    13. public class CreateTableTask {
    14. @Autowired
    15. private BusTableMapper busTableMapper;
    16. private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYYMMdd");
    17. public void creatTable(){
    18. TableInfo tableInfo = busTableMapper.showCreateTable(TableConstant.SHOW_CREATE_TABLE_SQL + TableConstant.TABLE_EXAMPLE);
    19. String createTableString = tableInfo.getCreateTable().replace("CREATE TABLE", "CREATE TABLE IF NOT EXISTS ").replace(TableConstant.TABLE_EXAMPLE, TableConstant.TABLE_EXAMPLE + simpleDateFormat.format(DateUtils.addDays(new Date(), 1)));
    20. tableInfo.setCreateTable(createTableString);
    21. busTableMapper.createTableSql(tableInfo.getCreateTable());
    22. }
    23. }

    这里将表名和查看创建表的语句分别用常量替代

    1. package com.ruoyi.quartz.constants;
    2. public class TableConstant {
    3. public static final String SHOW_CREATE_TABLE_SQL = "show create table ";
    4. public static final String TABLE_EXAMPLE = "bus_badao_record";
    5. }

    然后配置定时任务的执行频率和开关可以通过若依自带的页面中配置和实现

     

    然后执行第一步获取的tableInfo为

     

    此时createTable中就是具体的建表语句,内容为

    1. CREATE TABLE `bus_badao_record` (
    2. `id` int NOT NULL AUTO_INCREMENT,
    3. `x` varchar(255) DEFAULT NULL,
    4. `y` varchar(255) DEFAULT NULL,
    5. `record_time` datetime DEFAULT NULL,
    6. PRIMARY KEY (`id`)
    7. ) ENGINE=InnoDB DEFAULT charset=utf8mb3

    然后将建表字符串中的CREATE TABLE替换成CREATE TABLE IF NOT EXISTS

    确保在执行创建新的表之前是不存在的。

    然后将表名替换成待明天的时间标识的表名。然后该建表语句就会变成

    1. CREATE TABLE IF NOT EXISTS `bus_badao_record20220805` (
    2. `id` int NOT NULL AUTO_INCREMENT,
    3. `x` varchar(255) DEFAULT NULL,
    4. `y` varchar(255) DEFAULT NULL,
    5. `record_time` datetime DEFAULT NULL,
    6. PRIMARY KEY (`id`)
    7. ) ENGINE=InnoDB DEFAULT charset=utf8mb3

    这样就可以通过设置定时任务,让其指定一个时间比如12小时创建明天的表。

    4、执行一遍该定时任务的效果

     

  • 相关阅读:
    单片机的变量竟然被无故修改了.
    Android 4.4 如何添加按键流程
    Gunicorn ImportError: cannot import name ‘ALREADY_HANDLED‘ from ‘eventlet.wsgi‘
    linux驱动程序的加载顺序
    Enzo蛋白聚集分析试剂盒——快速、特异性和定量标记
    MongoDB高级特性&各种集群
    PreScan快速入门到精通第二十六讲PreScan中常用传感器之Beacon和OBU
    合作式智能运输系统-车用通信系统应用层及应用数据交互标准 第一阶段2020
    C#对象序列化
    LabVIEW性能和内存管理 4
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126161849