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方法即可:
- 首先在UserMapper中定义更新方法:
public interface UserMapper extends BaseMapper<AppUser> { int updateExpiredUserPayant(); }
- 对应的Mapper XML中写SQL:
<update id="updateExpiredUserPayant"> UPDATE app_user SET `payant` = 0 WHERE DATE_ADD(`creatdate_time`, INTERVAL +3 MONTH) <= CURRENT_DATE() </update>
- 定时任务中调用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
相关产品推荐
相关产品推荐

