在我们公司,我们有一个用例来解析一个有50k记录的csv文件。我的任务是逐行读取csv文件,转换为objets然后插入到多个表中。我正在使用sprint jdbc批处理机制将其写入表中。现在我的问题是我无法将数据写入多个表。
insert into role(name, code) values(?,?);
insert into person(first_name, last_name, description, role_id) values(?,?,?,?);
有人可以告诉我如何获取最后插入的role_id,然后将其传递给第二个查询。所有操作都在jdbcbatcupdate方法中进行。
答案 0 :(得分:1)
使用JDBC批量更新机制,实际上无法使用独立于驱动程序的解决方案来获取生成的密钥。 Spring JIRA for this上存在问题,但已关闭,因为"无法修复"。
您最好的选择是删除批处理机制并逐行更新数据库。逻辑将成为:插入新角色,获取最后插入的role_id并使用它来插入新人。
您可以使用GeneratedKeyHolder
这样检索最后一个role_id:
KeyHolder holder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
//set values in ps
}
}, holder);
Long newRoleId = holder.getKey().longValue();
答案 1 :(得分:0)
我只是在第二个值中使用subselect作为id。而不是使用
insert into role(name, code) values(?,?);
insert into person(first_name, last_name, description, role_id) values(?,?,?,?);
为什么不使用(假设角色是唯一的):
insert into role(name, code) values(?,?);
insert into person(first_name, last_name, description, role_id) values(?,?,?,select id from role where name = ? and code = ?);