有一个场景,我们想从一个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,...);
}
}
}
}