SQL 中删除超出时间限制的数据,并返回删除数据信息(Mybatis+postgresql)
前言
前一阵子,接到一个活,主要内容是这样的,数据库中存在一些过期的日志(可能是一天前的数据,或者是一个月前的数据,等等),将这些数据删除掉,并且返回这些数据的信息(就是说我得知道自己到底删了哪些数据呀?)。苦于在网上找了好久,终无果,于是清明小长假,便在自己的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
谢谢大家
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spring 注入 Bean 到 List / Map 中
前言 由于在工作中遇到了这样的问题,所以随笔写下来,记录一下。我们平常习惯的注入方式是:@Autowiredprivate 类的名称 对象名称;这种方式是最简单的,也是最实用的。但是有些时候我们就需要将实现了同样接口的Bean注入到Context中,然后可以用 List / Map 接受注入的对象。 正文 想象一下这样的例子,我们需要解析一个字符串,有好几个解析这个字符串的Service,然后在对赢得地方使用对应的Service。如果我们把每一个解析器Service都有一个自己的接口,那么就违背了,他们都在做同一件事,只是做法不同的初衷。如果是有默认解析器,可以使用@Primary注解(这个注解会在实现相同接口的Bean中找到有@Primary,把这个Bean作为优先级最高的注入进来),如果有好多个@Primary, Spring 又会傻傻分不清,到底要注入那个,于是就会报Exception,这个时候我们可以使用@Qualifier具体指定以哪个实体类注入。如果这样的话,当我们在一个地方需要好多个解析器,我们得写好多个@Autowired以及具体指定的@Qualifier。Spring...
- 下一篇
java干货spring框架
1、什么是Spring框架?Spring框架有哪些主要模块?Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。2、使用Spring框架能带来哪些好处?下面列举了一些使用Spring框架带来的主要好处:Dependency Injection(DI) 方法使得构造器和JavaBean properties文件中的依赖关系一目了然。与EJB容器相比较,IoC容器更加趋向于轻量级。这样一来IoC容器在有限的内存和CPU资源的情况下进行应用程序的开发和发布就变得十分有利。Spring并没有闭门造车,Spring利用了已有的技术比如ORM框架、logging框架、J2EE、Quar...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启