首页 > 编程语言 >java-自动建表-按月份

java-自动建表-按月份

时间:2023-07-18 11:56:24浏览次数:55  
标签:建表 String import 自动 file sql java conn

采用的是xxl-job任务调度

import org.apache.commons.io.FileUtils;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.File;

import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;

/**
 * 自动建表-按月份
 */
@Component
public class CreateTableJob {
    private static final Logger logger = LoggerFactory.getLogger(CreateTableJob.class);

    public static final String TABLE_PREFIX = "_";

    @Resource
    private JdbcTemplate jdbcTemplate;

    @XxlJob(value = "createTableJob")
    public ReturnT<String> execute(String param) throws Exception {
        String[] tableNames = param.split(",");
        // 获取当前年月
        int year = LocalDate.now().getYear();
        int month = LocalDate.now().getMonthValue();
        // 月份 `+1`,创建下月表结构
        month = month == 12 ? 1 : month + 1;
        String monthStr = month >= 10 ? String.valueOf(month) : "0" + month;
        String suffix = year + monthStr;
        Connection conn = null;
        InputStream in = null;
        try {
            conn = jdbcTemplate.getDataSource().getConnection();
            for (String name : tableNames) {
                String tableName = name + TABLE_PREFIX + suffix;
                String[] types = new String[]{"TABLE"};
                ResultSet rs = conn.getMetaData().getTables(conn.getCatalog(), conn.getSchema(), "%", types);

                boolean exist = false;
                // 判断是否存在
                while (rs.next()) {
                    String tableStr = rs.getString("TABLE_NAME");
                    if (tableStr.equals(tableName)) {
                        logger.info("表存在: {}", tableName);
                        exist = true;
                        break;
                    }
                }

                // 不存在则创建
                if (!exist) {
                    logger.info("创建表: {}", tableName);
                    in = this.getClass().getClassLoader().getResourceAsStream("tableTemplate/" + name + ".sql");
                    // 创建临时文件(空文件)
                    File file = File.createTempFile("test", ".sql");
                    // 删除临时文件
                    file.deleteOnExit();
                    // 将获取的流转为文件,在转换过后我们的资源文件就被copy到前面创建的临时文件中了
                    FileUtils.copyInputStreamToFile(in, file);
                    logger.info("临时文件路径: {}", file.getAbsolutePath());
                    // 转成string输入文本
                    String content = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
                    // 获取sql
                    String sql = String.format(content, tableName);
                    PreparedStatement ps = conn.prepareStatement(sql);
                    ps.execute();
                }
            }
            return ReturnT.SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return new ReturnT<>(IJobHandler.FAIL.getCode(), "command exit value(" + e.getMessage() + ") is failed");
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

sql文件存放位置(src/main/resources/tableTemplate/xxxx.sql)

ps:同时避免了“cannot be resolved to absolute file path because it does not reside in the file system: jar:file”异常

 

标签:建表,String,import,自动,file,sql,java,conn
From: https://www.cnblogs.com/xu-m/p/17562505.html

相关文章

  • 审批自动化发布
    发布申请流程发布申请LarkPC或APP端通过「工作台」-「审批」查找创建飞书审批飞书&LarkPC或APP端:「工作台」-「审批中心」-「管理后台」创建审批审批设计保存approval_codeid订阅审批事件时需要创建应用开发者后台-创建应用https://open.larksuite.com/app添加订阅事件提......
  • 设计模式-组合模式在Java中的使用示例-杀毒软件针对文件和文件夹进行杀毒
    场景组合模式组合模式(CompositePattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。在组合模式中引......
  • javascript-js正则表达式-常用的正则表达式
    js常用的正则表达式1.匹配Email地址:constemailRegex=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;2.匹配URL:consturlRegex=/^(https?:\/\/)?([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})(:[0-9]+)?(\/[^\s]*)?$/;3.匹配日期(YYYY-MM-DD):constdateRegex=/^\d{4}-(0[1-9]|......
  • 介绍社交论坛问答发帖系统源码-java+vue+uniapp开发前后端
    前后端分离社交论坛问答发帖BBS源码,社交论坛小程序|H5论坛|,app论坛是java+vue+uniapp开发的前后端分离社交论坛问答发帖/BBS项目,包括论坛图文帖,视频,圈子,IM私聊,微信支付,付费贴,积分签到,钱包充值等论坛小程序论坛app完整功能演示地址:www.runruncode.com/java/19462.html ......
  • 订单超时自动取消的技术方案解析及代码实现
    前言订单超时自动取消是电商平台中常见的功能之一,例如在淘宝、京东、拼多多等商城下单后,如果在一定的时间内没有付款,那么订单会自动被取消,是怎么做到的呢?作为技术人员我们应该了解自动取消的原理和实现逻辑,本文将介绍几种常用的技术方案,帮助开发者实现订单超时自动取消的功能。......
  • 使用 JavaScript 脚本来进行复杂的查询改写
    有这么一个需求:网关里怎样对跨集群搜索进行支持的呢?我想实现:输入的搜索请求是lp:9200/index1/_search这个索引在3个集群上,需要跨集群检索,也就是网关能否改成lp:9200/cluster01:index1,cluster02,index1,cluster03:index1/_search呢?索引有一百多个,名称不一定是app,还......
  • 电脑 主机名/设备名称(hostname) 被 自动 复原/复位 为 Administrator
    更改:文件:[Service.bat](C:\ProgramFiles(x86)\CommonFiles\AutodeskShared\NetworkLicenseManager\Service.bat)。注释掉包含'Administrator'(区分大小写)的行(×3)。::NLM::RegAdd"HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion"/vRegi......
  • Java中的深克隆和浅克隆(Clone)
    浅克隆(shallowclone)和深克隆(deepclone)是两种不同的对象复制方法。浅克隆会创建一个新对象,然后将原始对象的所有字段复制到新对象中。如果字段是基本类型,则它们的值将被直接复制。如果字段是引用类型,则只会复制引用,而不会复制引用指向的对象。这意味着原始对象和克隆对象中的引......
  • Java中七七八八的各种锁
    乐观锁or悲观锁乐观锁即蹲坑不锁门,只会在更新的时候判断有没有其他线程去更改数据,有的话就回滚典型:悲观锁即进厕所立马锁门,其他线程来了即阻塞,进到阻塞队列中,等待主线程蹲坑完毕后,按顺序获取典型:synchronized和ReentrantLock独占锁or共享锁顾名思义,独占锁即获......
  • 建表
    見表CREATETABLE`external_source`.`algorithm_tag`(`tag_code`STRING,`category_code`STRING,`category_cn`STRING,`category_en`STRING,`category_dep`STRING,`first_level_tag_code`STRING,`first_level_tag_cn`STRING,`first_level_tag_......