场景
若依前后端分离版本地搭建开发环境并运行项目的教程:
若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客_前后端分离项目本地运行
在上面的框架的使用基础上,需要在代码中获取某个表的建表语句,并根据业务
需求动态的建新的表。
比如在定时任务中执行固定的代码,在代码中获取某个表的建表语句,然后以时间
为后缀新建新的一个表。
比如新建表:
CREATE TABLE `bus_badao_record` (
`id` int NOT NULL AUTO_INCREMENT,
`x` varchar(255) DEFAULT NULL,
`y` varchar(255) DEFAULT NULL,
`record_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) 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
package com.ruoyi.quartz.domain;
public class TableInfo {
private String table;
private String createTable;
public String getTable() {
return table;
}
public void setTable(String table) {
this.table = table;
}
public String getCreateTable() {
return createTable;
}
public void setCreateTable(String createTable) {
this.createTable = createTable;
}
}
2、针对该实体类新建Mapper接口
package com.ruoyi.quartz.mapper;
import com.ruoyi.quartz.domain.TableInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface BusTableMapper {
public int createTableSql(String sql);
public TableInfo showCreateTable(String sql);
}
对应mapper.xml的文件内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.quartz.mapper.BusTableMapper">
<resultMap id="TableInfoResult" type="com.ruoyi.quartz.domain.TableInfo">
<result property="table" column="Table"/>
<result property="createTable" column="Create Table"/>
</resultMap>
<update id="createTableSql" parameterType="int">
${sql}
</update>
<select id="showCreateTable" resultMap="TableInfoResult" parameterType="string">
${sql}
</select>
</mapper>
将Create Table字段的返回值映射到createTable字段。
3、这里定时任务使用的若依集成的quartz实现,在定时任务的具体实现类中
package com.ruoyi.quartz.task;
import com.ruoyi.quartz.constants.TableConstant;
import com.ruoyi.quartz.domain.TableInfo;
import com.ruoyi.quartz.mapper.BusTableMapper;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
//动态创建表定时任务
@Component("createTableTask")
public class CreateTableTask {
@Autowired
private BusTableMapper busTableMapper;
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYYMMdd");
public void creatTable(){
TableInfo tableInfo = busTableMapper.showCreateTable(TableConstant.SHOW_CREATE_TABLE_SQL + TableConstant.TABLE_EXAMPLE);
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)));
tableInfo.setCreateTable(createTableString);
busTableMapper.createTableSql(tableInfo.getCreateTable());
}
}
这里将表名和查看创建表的语句分别用常量替代
package com.ruoyi.quartz.constants;
public class TableConstant {
public static final String SHOW_CREATE_TABLE_SQL = "show create table ";
public static final String TABLE_EXAMPLE = "bus_badao_record";
}
然后配置定时任务的执行频率和开关可以通过若依自带的页面中配置和实现
然后执行第一步获取的tableInfo为
此时createTable中就是具体的建表语句,内容为
CREATE TABLE `bus_badao_record` (
`id` int NOT NULL AUTO_INCREMENT,
`x` varchar(255) DEFAULT NULL,
`y` varchar(255) DEFAULT NULL,
`record_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT charset=utf8mb3
然后将建表字符串中的CREATE TABLE替换成CREATE TABLE IF NOT EXISTS
确保在执行创建新的表之前是不存在的。
然后将表名替换成待明天的时间标识的表名。然后该建表语句就会变成
CREATE TABLE IF NOT EXISTS `bus_badao_record20220805` (
`id` int NOT NULL AUTO_INCREMENT,
`x` varchar(255) DEFAULT NULL,
`y` varchar(255) DEFAULT NULL,
`record_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT charset=utf8mb3
这样就可以通过设置定时任务,让其指定一个时间比如12小时创建明天的表。
4、执行一遍该定时任务的效果
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135922.html