You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot项目如何实现指定SQL更新语句的自动执行?

完全可以实现,Spring Boot生态下有非常成熟的定时任务方案可以满足这个需求,最常用的是Spring自带的@Scheduled注解实现轻量定时任务,不需要额外引入第三方依赖,实现步骤如下:

1. 开启定时任务支持

首先在项目的启动类或者自定义配置类上添加@EnableScheduling注解,开启Spring的定时任务能力:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling // 开启定时任务
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

2. 编写定时任务执行逻辑

创建定时任务类,交给Spring容器管理,配置任务的执行周期,在任务方法中执行目标SQL即可。

方案1:使用JdbcTemplate直接执行SQL

如果项目没有用ORM框架,可以直接用Spring自带的JdbcTemplate执行更新语句:

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Component
public class UserPayantUpdateTask {

    @Resource
    private JdbcTemplate jdbcTemplate;

    // cron表达式表示每天凌晨0点执行,可根据业务需求调整执行时间
    @Scheduled(cron = "0 0 0 * * ?")
    @Transactional(rollbackFor = Exception.class)
    public void updateExpiredUserPayant() {
        String sql = "UPDATE app_user SET `payant` = 0 WHERE DATE_ADD(`creatdate_time`, INTERVAL +3 MONTH) <= CURRENT_DATE()";
        // 执行更新
        jdbcTemplate.update(sql);
    }
}

方案2:搭配ORM框架执行(以MyBatis为例)

如果项目用了MyBatis/MyBatis-Plus/JPA等ORM框架,只需要把SQL写在对应Mapper层,定时任务中调用Mapper方法即可:

  1. 首先在UserMapper中定义更新方法:
public interface UserMapper extends BaseMapper<AppUser> {
    int updateExpiredUserPayant();
}
  1. 对应的Mapper XML中写SQL:
<update id="updateExpiredUserPayant">
    UPDATE app_user 
    SET `payant` = 0  
    WHERE DATE_ADD(`creatdate_time`, INTERVAL +3 MONTH) <= CURRENT_DATE()
</update>
  1. 定时任务中调用Mapper方法:
@Component
public class UserPayantUpdateTask {

    @Resource
    private UserMapper userMapper;

    @Scheduled(cron = "0 0 0 * * ?")
    @Transactional(rollbackFor = Exception.class)
    public void updateExpiredUserPayant() {
        userMapper.updateExpiredUserPayant();
    }
}

注意事项

  • 执行时间建议选业务低峰期(比如凌晨),避免大批量更新锁表影响正常业务请求
  • 如果app_user表数据量超过10万,建议分批更新,单次更新限定行数,避免长事务占锁时间过长
  • 你当前的SQL本身具备幂等性,重复执行不会产生脏数据,即使定时任务重复触发也不会有问题
  • 如果需要更复杂的任务调度能力(比如集群部署下避免任务重复执行、任务失败重试等),可以集成Quartz或者XXL-Job等分布式任务调度框架

内容的提问来源于stack exchange,提问作者Mohamed Yassine Messaoud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 05:15:03