我需要使用 JdbcBatchItemWriter 将数据插入到两个表中。
我有两个表 TABLE_A、TABLE_B。
TABLE_B 是具有外键关系的 TABLE_A 的子级。我成功地使用此批处理写入器将数据插入到 TABLE_A。
但是,由于 FK 约束,我无法知道要在 TABLE_B 中插入的 FK 值。
请让我知道是否有一种方法可以在此过程中获取插入到 TABLE_A 中的记录的主键值,以便我可以构建一个对象并将 itemwrite 到 TABLE_B 中。
我需要使用 JdbcBatchItemWriter 将数据插入到两个表中。
我有两个表 TABLE_A、TABLE_B。
TABLE_B 是具有外键关系的 TABLE_A 的子级。我成功地使用此批处理写入器将数据插入到 TABLE_A。
但是,由于 FK 约束,我无法知道要在 TABLE_B 中插入的 FK 值。
请让我知道是否有一种方法可以在此过程中获取插入到 TABLE_A 中的记录的主键值,以便我可以构建一个对象并将 itemwrite 到 TABLE_B 中。
我不确定JdbcBatchItemWriter
开箱即用是否会为您提供功能,因为它使用的batchUpdate
操作不会返回生成的主键而是返回受影响的行数。
您可能必须实现自己的编写器,在这种情况下,请查看此内容以提供有关从 java sql 中检索生成的 id 的见解。
我建议使用扩展 JdbcTemplate 的 DAO 来执行此操作。
我在项目中使用 SimpleJdbcInsert(DB2 驱动程序问题!!)时遇到问题,所以我终于使用了这段代码!!
您可以像这样实现自己的 InsertAndReturnKey 方法:
public Number insertAndReturnKey(final Domain param) {
final String INSERT_SQL = "insert INTO " + DomainEnum.TABLE_NAME.value() +
" (" + DomainEnum.F1.value() + ","
+ DomainEnum.F2.value() + ","
+ DomainEnum.F3.value() + ","
+ DomainEnum.F4.value() + ","
+ DomainEnum.F5.value() + ","
+ DomainEnum.F6.value() + ","
+ DomainEnum.F7.value() + ") values(?,?,?,?,?,?,?)";
log.info(INSERT_SQL);
KeyHolder keyHolder = new GeneratedKeyHolder();
this.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps =
connection.prepareStatement(INSERT_SQL, new String[] {SommaireReglementMetaData.ID.value()});
ps.setString(1, param.getF1());
ps.setString(2, param.getF2());
ps.setLong(3, param.getF3());
ps.setTimestamp(4, param.getF4());
ps.setString(5, param.getF5());
ps.setTimestamp(6, param.getF6());
ps.setTimestamp(7, param.getF7());
return ps;
}
},
keyHolder);
return keyHolder.getKey();
}
所以基本上,你可以使用这种方法来插入你的父母。然后使用 batchUpdate 插入所有孩子。
问题:您有很多 TABLE_A(父母)还是只有 1 和很多 TABLE_B 记录?