Spring Batch Dynamic Insert and Update with DB to DB



有一个场景,我们想从一个DB加载数据到另一个DB。但是我们想要检查目标系统中是否已经存在数据,然后更新它,否则将其插入到DB中。

我们使用下面的方法:

@Bean
ItemWriter<Student> onosItemWriter1() {
JdbcBatchItemWriter<Student> databaseItemWriter = new JdbcBatchItemWriter<>();
databaseItemWriter.setDataSource(dataSource);
databaseItemWriter.setJdbcTemplate(namedParameterJdbcTemplate);
databaseItemWriter.setSql(INSERT_QUERY);
ItemPreparedStatementSetter<Student> valueSetter = new ItemPreparedStatementSetter<Student>() {
@Override
public void setValues(Student student, PreparedStatement statement) throws SQLException {
if (Student.getId() < 0) {
log.info("Inserting!");
databaseItemWriter.setSql(INSERT_QUERY);
statement.setString(1, student.getName());
statement.setString(2, student.getEmail());
} else {
log.info("updateing!!!!");
databaseItemWriter.setSql(UPDATE_QUERY);
statement.setString(1, student.getName());
statement.setString(2, student.getEmail());
}
}
};
databaseItemWriter.setItemPreparedStatementSetter(valueSetter);
return databaseItemWriter;
}

只对insert有效。如何使用一个JDBC批处理项目编写器来动态更新它?如果记录已经存在于块中

您共享的代码将不起作用,因为您正在根据项目本身(Student.getId() < 0)的运行时信息配置项目写入器上的查询。

我们想要检查数据是否已经存在于目标系统中,然后更新它,否则将它插入到DB

我会保持简单,写一个自定义项目写入器,如下所示:

public class StudentItemWriter implements ItemWriter<Student> {

private static final String INSERT_QUERY = "insert into student ...";
private static final String UPDATE_QUERY = "update student set ... where id = ?";

private JdbcTemplate jdbcTemplate;

public StudentItemWriter(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public void write(List<? extends Student> students) throws Exception {
for(Student student : students) {
int updated = jdbcTemplate.update(UPDATE_QUERY,...);
if(updated == 0) {
jdbcTemplate.update(INSERT_QUERY,...);  
}                               
}
}
}

最新更新