SQL 中删除超出时间限制的数据,并返回删除数据信息(Mybatis+postgresql)

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 前言前一阵子,接到一个活,主要内容是这样的,数据库中存在一些过期的日志(可能是一天前的数据,或者是一个月前的数据,等等),将这些数据删除掉,并且返回这些数据的信息(就是说我得知道自己到底删了哪些数据呀?)。

前言

前一阵子,接到一个活,主要内容是这样的,数据库中存在一些过期的日志(可能是一天前的数据,或者是一个月前的数据,等等),将这些数据删除掉,并且返回这些数据的信息(就是说我得知道自己到底删了哪些数据呀?)。苦于在网上找了好久,终无果,于是清明小长假,便在自己的mac上,简单的搭了个环境,试了一下,谁让自己是初出茅庐的小菜鸟呢。因为看到网上很多都是关于sql如何操作的,但是并没有结合Mybatis的,所以在这里记录一下,方便自己日后使用,也希望可以帮到那些一直寻找的人。

正文

先给大家看一下我自拟的表结构:

-- ----------------------------
-- Table structure for eventLog
-- ----------------------------
DROP TABLE IF EXISTS "public"."eventLog";
CREATE TABLE "public"."eventLog" (
  "id" int4 NOT NULL DEFAULT nextval('"eventLog_id_seq"'::regclass),
  "start_time" timestamp(6),
  "log_detail" varchar(255) COLLATE "pg_catalog"."default"
)
;
ALTER TABLE "public"."eventLog" OWNER TO "harry";

-- ----------------------------
-- Primary Key structure for table eventLog
-- ----------------------------
ALTER TABLE "public"."eventLog" ADD CONSTRAINT "eventLog_pkey" PRIMARY KEY ("id");

表很简单,一共有三个字段,id为自增主键, start_time 为需要看是否过期的字段,log_detail 为这个日志的详细内容。

接下来贴出大家关心的 Mybatis 中的代码:

<?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.example.harry.dao.EventLogMapper">
    <resultMap id="BaseMap" type="com.example.harry.entity.EventLog">
      <id column="id" property="id" jdbcType="INTEGER" javaType="java.lang.Integer"/>
      <result column="start_time" property="time" jdbcType="TIMESTAMP" javaType="java.sql.Timestamp"/>
      <result column="log_detail" property="logDetail" jdbcType="VARCHAR" javaType="java.lang.String"/>
    </resultMap>
        <insert id="insertEventLog"  parameterType="EventLog" useGeneratedKeys="true" keyProperty="id">
            insert into "eventLog" (start_time,log_detail) values (now(),#{logDetail});
        </insert>

        <select id="deleteOverdueLog" resultType="map">
            DELETE
            FROM "eventLog"
            <![CDATA[ WHERE start_time < now()::TIMESTAMP + '-${overdueDays} days']]>
            RETURNING id, start_time, log_detail;
        </select>
    
    </mapper>

最重要的就是哪个select方法,很多人就要问了,为什么是delete的语句,你却要用select的标签呢?
这个问题问的好,刚开始我也是用的delete,但是不管sql怎么写,返回的都是一个Integer,然后转念一想,Mybatis是基于JDBC的,在JDBC中 增删改执行的都是 executeUpdate方法,这个方法返回整数就是受影响的行数,所以如果想在删除的同时,返回删除行的信息,就一定要用select。
在这里,我想要强调四点:
1.我这里让它返回的是个List>所以 使用的是

resultType="map"

如果想要装载进EventLog的实体类中,我们可以使用

resultMap="BaseMap"

关于resultType和resultMap的区别,我就不在这里赘述了,详细的可以查看官网(赞一下官网,写的真的很好)。
2. overdueDays是我传递进来的Integer的参数,代表的是具体的天数,可以配置在application.properties中,方便由于业务修改造成的变化。这里使用的是 ${},而不是#{}。是因为#{}会做防注入处理,把参数换为 ‘?’,并且将参数自动的加上引号,而${} 就不会只是单纯的做替换。
3. something 这里可以把something换成任意语句,并且something的语句不会被转义,因为我们这里用到了'<',' ' '(就是小于号和单引号),所以我们不希望它被转义。
4. RETURNING 后面接的就是我们具体想要返回删除行的哪些字段。

Tips:
SQL除了以上写法,还有另一种写法:

WITH deleteInfo AS (DELETE
            FROM "eventLog"
            <![CDATA[ WHERE start_time < now()::TIMESTAMP + '-${overdueDays} days']]>
            RETURNING id, start_time, log_detail)
SELECT * FROM deleteInfo;

后记

具体的项目我已经上传到了 github上,如果有需要可以进行下载https://github.com/luckypoison/postgresBootLearn.git
谢谢大家

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
3天前
|
SQL Java 测试技术
3、Mybatis-Plus 自定义sql语句
这篇文章介绍了如何在Mybatis-Plus框架中使用自定义SQL语句进行数据库操作。内容包括文档结构、编写mapper文件、mapper.xml文件的解释说明、在mapper接口中定义方法、在mapper.xml文件中实现接口方法的SQL语句,以及如何在单元测试中测试自定义的SQL语句,并展示了测试结果。
3、Mybatis-Plus 自定义sql语句
|
6天前
|
SQL 存储 分布式计算
|
10天前
|
SQL 物联网 数据处理
"颠覆传统,Hive SQL与Flink激情碰撞!解锁流批一体数据处理新纪元,让数据决策力瞬间爆表,你准备好了吗?"
【8月更文挑战第9天】数据时代,实时性和准确性至关重要。传统上,批处理与流处理各司其职,但Apache Flink打破了这一界限,尤其Flink与Hive SQL的结合,开创了流批一体的数据处理新时代。这不仅简化了数据处理流程,还极大提升了效率和灵活性。例如,通过Flink SQL,可以轻松实现流数据与批数据的融合分析,无需在两者间切换。这种融合不仅降低了技术门槛,还为企业提供了更强大的数据支持,无论是在金融、电商还是物联网领域,都将发挥巨大作用。
30 6
|
10天前
|
SQL 安全 数据处理
揭秘数据脱敏神器:Flink SQL的神秘力量,守护你的数据宝藏!
【8月更文挑战第9天】在大数据时代,Apache Flink以其强大的流处理能力脱颖而出,而Flink SQL则为数据处理带来了灵活性。本文介绍如何运用Flink SQL实现数据脱敏——一项关键的隐私保护技术。通过内置函数与表达式,在SQL查询中加入脱敏逻辑,可有效处理敏感信息,如个人身份与财务数据,以符合GDPR等数据保护法规。示例展示了如何对信用卡号进行脱敏,采用`CASE`语句检查并替换敏感数据。此外,Flink SQL支持自定义函数,适用于更复杂的脱敏需求。掌握此技能对于保障数据安全至关重要。
31 5
|
12天前
|
SQL 关系型数据库 MySQL
“震撼揭秘!Flink CDC如何轻松实现SQL Server到MySQL的实时数据同步?一招在手,数据无忧!”
【8月更文挑战第7天】随着大数据技术的发展,实时数据同步变得至关重要。Apache Flink作为高性能流处理框架,在实时数据处理领域扮演着核心角色。Flink CDC(Change Data Capture)组件的加入,使得数据同步更为高效。本文介绍如何使用Flink CDC实现从SQL Server到MySQL的实时数据同步,并提供示例代码。首先确保SQL Server启用了CDC功能,接着在Flink环境中引入相关连接器。通过定义源表与目标表,并执行简单的`INSERT INTO SELECT`语句,即可完成数据同步。
37 1
|
18天前
|
SQL 关系型数据库 数据库
|
1天前
|
SQL 移动开发 Oracle
SQL查询连续六天数据记录的技巧与方法
在数据库查询中,实现针对连续几天(如连续六天)的数据筛选是一个常见且稍具挑战性的任务
|
1天前
|
SQL 数据库 索引
SQL语言入门:如何表达你的数据需求
在数据库的世界里,SQL(Structured Query Language)是一种至关重要的语言,它允许用户与数据库进行交互,执行数据的查询、更新、插入和删除等操作
|
4天前
|
SQL 存储 数据管理
解锁 SQL Server 2022的时间序列数据功能
【8月更文挑战第14天】解锁SQL Server 2022的时间序列数据功能需先确认版本支持;接着创建数据库与含时间列的表,如`TimeSeriesData`;然后插入时间序列数据;利用内置函数如窗口函数计算移动平均等统计;最后针对大数据量配置索引及分区以优化性能。这流程助力高效处理时间序列数据。
|
6天前
|
SQL
SQL SERVER数据分组后取第一条数据——PARTITION BY
SQL SERVER数据分组后取第一条数据——PARTITION BY
12 0