java - 如何将单行数据插入到多个表中

标签 java mysql csv spring-batch

在我们公司,我们有一个用例来解析具有 50k 记录的 csv 文件。我的任务是逐行读取 csv 文件,转换成对象,然后插入到多个表中。我正在使用 sprint jdbc 批处理机制将其写入表中。现在我的问题是我无法将数据写入多个表。

insert into role(name, code) values(?,?);
insert into person(first_name, last_name, description, role_id) values(?,?,?,?);

有人能告诉我如何获取最后插入的 role_id,然后将其传递给第二个查询。所有操作都在 jdbcbatcupdate 方法内部发生。

最佳答案

使用JDBC批量更新机制,其实是没有办法用驱动无关的方案来获取生成的key的。 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();

关于java - 如何将单行数据插入到多个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28518211/

相关文章:

php - 如何防止不同设备同时登录同一个账号?

mysql - 如何使用sql update在mysql中编辑多条记录

python - 从 csv 文件中删除不需要的值的快速、准确、可靠的方法

java - 如何从 TestNG 测试和 Selenium 的接口(interface)调用默认方法?

java - 当在 jar 中启动camel路由并在同一个 jar 中注入(inject)camelContextbean时,带有限定符 @Default 的 CamelContextBean 类型的依赖关系不满足

mysql - 如何在expect/TCL脚本中从转储文件创建MySQL数据库?

csv - 如何在 Rust 中读取和处理管道分隔文件?

python - 如何通过python将多页数据导出到excel?

java - 如何在JPA中保存外键实体

java - Spring数据 Autowiring : Two bean candidates using @Autowired