mysql过期数据的清理方案(Java/springboot+mybatis)

news2024/11/18 20:02:39

比如说现在数据库表信息增加的很快,然后我们需要对每个表设置过期删除策略;
大概思路就是:定时任务调度,给每个表制定sql,然后执行删除数据的sql

//删除一个月前的数据
delete  FROM test_info WHERE create_time < DATE_SUB(CURDATE(), INTERVAL 1 MONTH);

那么我们是不是可以把这条sql 在项目中进行执行,我这里是springboot+mybatis演示:
我们将上述sql的参数都提出来做成变量,然后调用,这里提取出来四个变量:

  • table_name :表
  • column_name:依据列(通常为时间字段 具体可以看看DATE_SUB 支:持哪些 我这里的时间类型是DATETIME)
  • expired_num:过期num
  • expired_unit:过期单位(月,天 等)
    在这里插入图片描述
    还有更多时间单位

现在code一下:
主要逻辑:

//思路:
//1、将表的过期处理信息制作成json,传入(这里的json可以管理起来,甚至于是数据表/redis的value),这里演示就直接以json的形式
//2、遍历 :拿到每个表的参数,并调用mybatis的mapper(绑定了xml)
//3、做好参数校验,防止注入风险,因为我们这块业务不对外暴露,所以只需要做简单的校验
//4、此时该方法就可以做成接口,甚至于定时任务等形式来处理过期数据
//5、做成这样放在项目内好管理,当然也可以做python脚本等形式,主要就是sql的调用,并做成合理的链
    public void clearExpiredData() {
        try {
            String inputData = "[{\"table_name\":\"test_info\",\"column_name\":\"create_time\",\"expired_num\":\"4\",\"expired_unit\":\"MONTH\"}," +
                    "{\"table_name\":\"test_info\",\"column_name\":\"create_time\",\"expired_num\":\"30\",\"expired_unit\":\"DAY\"}]";
            if (JSON.isValid(inputData)) {
                String tableNameFiled = "table_name";
                String columnNameFiled = "column_name";
                String expiredNumFiled = "expired_num";
                String expiredUnitFiled = "expired_unit";
                JSONArray jsonArray = JSON.parseArray(inputData);
                Iterator iterator = jsonArray.stream().iterator();
                while (iterator.hasNext()) {
                    JSONObject next = (JSONObject) iterator.next();
                    //校验包含特定的key,和过期单位必须是 DAY或者MONTH (mysql支持更多,但是这是业务)
                    if (next.containsKey(tableNameFiled) && next.containsKey(columnNameFiled) && next.containsKey(expiredNumFiled) && next.containsKey(expiredUnitFiled)
                            && (Objects.equals(next.get(expiredUnitFiled), "DAY") || (Objects.equals(next.get(expiredUnitFiled), "MONTH")))) {
                        String tableName = (String) next.get(tableNameFiled);
                        String columnName = (String) next.get(columnNameFiled);
                        String expiredNum = (String) next.get(expiredNumFiled);
                        String expiredUnit = (String) next.get(expiredUnitFiled);
                        int delExpiredDataNum = mysqlExpiredDataMapper.delExpiredData(tableName, columnName, Integer.parseInt(expiredNum), expiredUnit);
                        log.info("del expired mysql data table:{},column:{},expired:{}:{},size:{}", tableName, columnName, expiredNum, expiredUnit, delExpiredDataNum);
                    } else {
                        log.warn("current JSONObject param loss:{}", next.toJSONString());
                    }
                }
            } else {
                log.warn("valid error :{}", inputData);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

mapper.java

@Repository
public interface MysqlExpiredDataMapper {
    int delExpiredData(@Param("table_name") String table, @Param("column_name") String column, @Param("expired_num") int expiredNum, @Param("expired_unit") String expiredUnit);
}

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.zhidaohulian.analysis.mapper.MysqlExpiredDataMapper">

    <delete id="delExpiredData">
        delete
        FROM ${table_name}
        WHERE ${column_name} &lt; DATE_SUB(CURDATE(), INTERVAL #{expired_num} ${expired_unit});
    </delete>
</mapper>

注意点:
1、${}和#{},的区别,是上面穿参数的关键;
2、&lt; 是小于号
3、存在sql注入的危险,所以要在调用的时候做好参数校验,如果业务没有暴露的情况,那么这是一个不错的方案;

如果方案有不成熟的地方,欢迎大佬指出,小子优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1117358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言可执行程序到底怎样生成?

目录 程序的翻译环境 NO1.VS编译器工具 NO2.VS链接器工具 NO3.链接库是什么&#xff1f; 编译 预处理 编译 汇编 链接 程序的执行环境 C语言的程序到底是怎样生成的呢&#xff1f;又怎样去执行呢&#xff1f;我们来探索。本篇是讲解编译环境。 在ANSI C&#xff08…

如何避免osg绘制场景时因Z冲突导致绘制重影或不正常

目录 1. 问题的提出 2. Z冲突&#xff08;z-fighting&#xff09;简介 2.1. Z冲突&#xff08;z-fighting&#xff09;产生的原因 2.2. 如何消除Z冲突&#xff08;z-fighting&#xff09; 3. 代码实现 1. 问题的提出 今天绘制了一个棋盘格&#xff0c;鼠标在棋盘格上单击…

亲测防止google colab自动disconnect断连GPU

最近小虎在用colab跑diffusion的模型&#xff0c;但是运行的时候一直断连&#xff0c;就算充了会员也依然如此。 坏境 win11 chrome 解决方法 用Ctrl shift i打开console&#xff0c;输入 function ClickConnect() {console.log("Working");document.querySe…

倒计时 1 天|KCD 2023 杭州站

距离「KCD 2023 杭州站」开始只有 1 天啦 大家快点预约到现场哦&#xff5e; KCD 2023 活动介绍 HANGZHOU 关于 KCD Kubernetes Community Days&#xff08;KCD&#xff09;由云原生计算基金会&#xff08;CNCF&#xff09;发起&#xff0c;由全球各国当地的 CNCF 大使、CNCF 员…

STM32串口

前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 目前已经学习了GPIO的输入输出&#xff0c;但是没有完整的显示信息&#xff0c;最便宜的显示就是串口。 000 -111 AVR单片机 已经学会过了&#xff0c; 提示&#xff1a;以下是本篇文章正文内容&#x…

金蝶与电商集成如何调用奇门接口

电商领域的发展日新月异&#xff0c;为了实现企业的数字化转型&#xff0c;金蝶云等财务系统与电商平台的集成变得愈发关键。在本文中&#xff0c;我们将深入探讨奇门接口的应用&#xff0c;以及为什么它对于金蝶与电商集成如此重要。同时&#xff0c;我们将介绍如何借助轻易云…

【c➡️c++】打开c++学习之门2——内联函数-auto-空值(nullptr)

目录 &#x1f36d;内联函数 &#x1f576;️概念 &#x1f576;️特性&#xff1a; &#x1f449;auto关键字(C11) ➡️类型别名思考 ➡️ auto简介 ➡️auto的使用细则 ➡️auto不能推导的场景 &#x1f308;基于范围的for循环(C11) &#x1f6a9;范围for的语法 &…

基于java(ssm)水果销售管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

开箱即用的Appimage是什么以及如何建立快捷方式

1 引言 在使用Linux系统过程中&#xff0c;初学者会遇到无穷多的问题&#xff0c;包括软件的安装问题。 ubuntu的deb,centos的rpm, 当然以及需要解压的tar.gz等等。有一种开箱即用的软件安装类型&#xff0c;格式为Appimage。 AppImage 的官方网站是 AppImage | Linux apps tha…

Mysql中的RR 隔离级别,到底有没有解决幻读问题

Mysql 中的 RR 事务隔离级别&#xff0c;在特定的情况下会出现幻读的问题。所谓的幻读&#xff0c;表示在同一个事务中的两次相同条件的查询得到的数据条数不一样。 在 RR 级别下&#xff0c;什么情况下会出现幻读 这样一种情况&#xff0c;在事务 1 里面通过 update 语句触发当…

React基础: 项目创建 JSX 基础语法 React基础的组件使用 useState状态 基础样式控制

01 React 文章目录 01 React一、React是什么1、React的优势 二、React开发环境搭建1、创建项目2、运行项目3、项目的目录结构 三、JSX基础1、什么是 JSX代码示例&#xff1a; 2、JSX使用场景2.1代码示例&#xff1a; 3、JSX中实现列表渲染4、JSX - 实现基本的条件渲染5、JSX - …

Cmake用户交互指南

文章目录 一. 介绍1. 命令行cmake工具2. cmake gui工具 二. 生成构建系统1. 命令行环境2. 命令行-G选项3. 在cmake gui中选择生成器 三. 设置生成变量1. 在命令行上设置变量2. 使用cmake gui设置变量3. CMake缓存 四. 预设1. 在命令行上使用预设2. 在cmake gui中使用预设 五. 调…

【五:(mock数据)springboot+mock集成swaggerConfig】

目录 1、springboot 的Demo2、实例类3、服务类 get请求方法4、服务类的post请求方法5、swaggerConfig 接口文档生成配置依赖 SpringBootApplication ComponentScan("com.course") public class Application {public static void main(String[] args) {SpringApplicat…

【TensorFlow1.X】系列学习笔记【基础一】

【TensorFlow1.X】系列学习笔记【基础一】 大量经典论文的算法均采用 TF 1.x 实现, 为了阅读方便, 同时加深对实现细节的理解, 需要 TF 1.x 的知识 文章目录 【TensorFlow1.X】系列学习笔记【基础一】前言线性回归非线性回归逻辑回归总结 前言 本篇博主将用最简洁的代码由浅入…

AD20原理图库的制作

1、打开“51单片机最小系统”的工程文件。 2、创建原理图库文件&#xff1a;单击“文件”菜单&#xff0c;选择“新的”选项中的“库”选项&#xff0c;再选择“原理图库”&#xff0c;进入原理图库元件的编辑界面。 3、保存原理图库文件&#xff1a;选择“文件”菜单&#xff…

antd vue 组件 使用下拉框的层级来显示后面的输入框

效果图&#xff1a; 代码&#xff1a; HTML: <dir><a-row><a-col :span"4"><a-form-model-item label"审批层级" ><a-selectplaceholder"请选择审批层级"v-model"form.PlatformPurchaseApproveLevel"cha…

安达发|人工智能在APS高级计划与排程中的应用

随着人工智能&#xff08;AI&#xff09;技术的发展&#xff0c;其在生产计划与排程&#xff08;APS&#xff09;领域的应用也日益广泛。APS是一种复杂的系统工程&#xff0c;它需要处理大量的数据&#xff0c;包括需求预测、资源优化、路径规划等。AI技术的应用可以帮助企业更…

身份证读卡器ubuntu虚拟机实现RK3399 Arm Linux开发板交叉编译libdonsee.so找不到libusb解决办法

昨天一个客户要在RK3399 Linux开发板上面使用身份证读卡器&#xff0c;由于没有客户的开发板&#xff0c;故只能用本机ubuntu虚拟机来交叉编译&#xff0c;用客户发过来的交叉编译工具&#xff0c;已经编译好libusb然后编译libdonsee.so的时候提示找不到libusb&#xff0c;报错…

语音芯片KT142C两种音频输出方式PWM和DAC的区别

目录 语音芯片KT142C两种音频输出方式PWM和DAC的区别 一般的语音芯片&#xff0c;输出方式&#xff0c;无外乎两种&#xff0c;即dac输出&#xff0c;或者PWM输出 其中dac的输出&#xff0c;一般应用场景都是外挂功放芯片&#xff0c;实现声音的放大&#xff0c;比如常用的音箱…

csapp-Machine-Level Representation of Program-review

Machine-Level Representation of Program收获和思考 Basics Machine-Level Programming可以看成是机器执行对于上层代码的一种翻译&#xff0c;即硬件是如何通过一个个的指令去解释每一行代码&#xff0c;然后操纵各种硬件执行出对应的结果。 Machine-Level Programming有2种…