首页 > 解决方案 > Mybatis Spring Batch:如何在Tasklet中使用where子句从多个表中删除?

问题描述

我想从这样的各种表中进行多次删除:

DELETE FROM TABLE1 WHERE T1_ID = :id AND T1_CREATION_DATE IS NULL;
DELETE FROM TABLE2 WHERE T2_ID = :id AND T2_CREATION_DATE IS NULL;
COMMIT;

但有春季批次。

到目前为止,我尝试过:

String query = "DELETE FROM TABLE1 WHERE T1_ID = :id AND T1_CREATION_DATE IS NULL;"+
"DELETE FROM TABLE2 WHERE T2_ID = :id AND T2_CREATION_DATE IS NULL;"+
"COMMIT;";

@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

    jobContext = stepExecution.getJobExecution().getExecutionContext();

    Employee employee = (Employee) jobContext.get("employee");

    Map<String, Object> parameters = new HashMap<String, Object>();

    parameters.put("id", employee.getId());

    new NamedParameterJdbcTemplate(dataSource).update(query,parameters);

    return RepeatStatus.FINISHED;
}

它正在编译,但我遇到了一个糟糕的 SQL 语法异常,我认为这是因为 JdbcTemplates 不管理事务查询。

有什么提示吗?

PS:对于我使用Mybatis的读者和作者,有没有办法他可以处理多次删除?我试过了,但是我无法在Tasklet中使用mybatis sql语句

标签: javaspringjakarta-eespring-batchmybatis

解决方案


感谢您的帮助,我设法使它工作。

起初,我是用这样的单独模板来做的:

protected String expDelete = "DELETE FROM TABLE1 WHERE ID = :id AND CREATION_DATE IS NULL";
protected String dipDelete = "DELETE FROM TABLE2 WHERE ID = :id AND CREATION_DATE IS NULL";

Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("id", employeeInTreatment.getId());

new NamedParameterJdbcTemplate(this.dataSource).update(expDelete,parameters);
new NamedParameterJdbcTemplate(this.dataSource).update(dipDelete,parameters);

它有点工作(编译但没有提交删除)。但我确信我可以一口气完成。

我创建了一个服务和一个指向我的 mybatis 映射器的 dao:

employeeBatchDao.deleteEmployeeImportedData(employeeId);

<delete id="deleteEmployeeImportedData" parameterType="Integer">
   {call
       declare
       begin
           DELETE FROM TABLE1 WHERE ID = :id AND CREATION_DATE IS NULL;
           DELETE FROM TABLE2 WHERE ID = :id AND CREATION_DATE IS NULL;
       end
    }

我在我的tasklet中调用它并且它有效!现在我可以一次完成所有删除!


推荐阅读