admin管理员组文章数量:1794759
定期逻辑备份表并删除表中记录,mybatis 动态传入表名, springboot schedule定时任务动态(从数据库读取)读取执行
文章目录
- 1.1 需求和大致思路
- 1.2 mybatis动态传入表名
- 1.3 springboot schedule定时任务动态(从数据库读取)读取执行
1.1 需求和大致思路
要求把mysql的数据定时同步到另一个schema下,并清理数据,不同的表有不同的策略,如sys_operation_log表每个月调度一次备份数据并清理半年前的数据: 采用springboot schedule定时任务动态(从数据库读取)读取执行
create table if not exists ddh_sbztjk_prod.dump_del ( id int not null primary key, originTable varchar(100) not null, desTable varchar(100) not null, primaryCol varchar(100) not null, delWhere varchar(100) not null, cron varchar(100) not null ); <select id="getMax" resultType="java.lang.Long" statementType="STATEMENT"> select max(${col}) from ${des}.${desTable} </select> <insert id="insertToAnotherTable" statementType="STATEMENT"> insert into ${des}.${desTable} select * from ${origin}.${originTable} <where> <if test="colNum != null"> ${col} > ${colNum} </if> </where> </insert> <delete id="del" statementType="STATEMENT"> delete from ${origin}.${originTable} ${delWhere} </delete> 1.2 mybatis动态传入表名在动态sql解析过程,#{}与${}的效果是不一样的:#{} 占位符 ${} 拼接符 #{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,变量替换后,#{} 对应的变量自动加上单引号 ‘’
${ } 仅仅为一个纯粹的 string 替换,在动态 SQL 解析阶段将会进行变量替换,变量替换后, ${} 对应的变量不会加上单引号
注:
${}在预编译之前已经被变量替换了,这会存在sql注入风险 如
select * from ${tableName} where name = ${name}如果传入的参数tableName为user; delete user; --,那么sql动态解析之后,预编译之前的sql将变为:
select * from user; delete user; -- where name = ?;所以
${}一般用于传输数据库的表名、字段名等,能用#{}的地方尽量别用${} 1.3 springboot schedule定时任务动态(从数据库读取)读取执行mybatisplus反向工程生成实体类DumpDel,以及mapper service
@Data @EqualsAndHashCode(callSuper = false) @ApiModel(value="DumpDel对象", description="") public class DumpDel implements Serializable { private static final long serialVersionUID=1L; private Integer id; @TableField("originTable") private String originTable; @TableField("desTable") private String desTable; @TableField("primaryCol") private String primaryCol; @TableField("delWhere") private String delWhere; private String cron; }自定义实体类实现接口SchedulingConfigurer 重写configureTasks方法,向scheduledTaskRegistrar中添加任务,每个任务需要Runnable和Trigger Runnable对应调度任务
Trigger对应cron表达式
@Component public class DataRemoveSchedule implements SchedulingConfigurer { @Autowired private IDumpDelService dumpDelService; @Autowired private MyService myService; @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { // 获取所有任务 List<DumpDel> scheduleList = dumpDelService.list(); for (DumpDel s : scheduleList) { scheduledTaskRegistrar.addTriggerTask(getRunnable(s), getTrigger(s)); } } /** * runnable * * @param scheduleConfig * @return */ private Runnable getRunnable(DumpDel scheduleConfig) { return new Runnable() { @Override public void run() { myService.insertToAnotherTableAndDel(scheduleConfig.getOriginTable(), scheduleConfig.getDesTable(), scheduleConfig.getPrimaryCol(), scheduleConfig.getDelWhere()); } }; } /** * Trigger * * @param scheduleConfig * @return */ private Trigger getTrigger(DumpDel scheduleConfig) { return new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { CronTrigger trigger = new CronTrigger(scheduleConfig.getCron()); Date nextExec = trigger.nextExecutionTime(triggerContext); return nextExec; } }; } }版权声明:本文标题:定期逻辑备份表并删除表中记录,mybatis 动态传入表名, springboot schedule定时任务动态(从数据库读取)读取执行 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686477595a71913.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论