使用spring jdbcTemplate将数据插入多个表

时间:2014-07-05 18:02:04

标签: java mysql spring spring-jdbc

我正在使用java,spring jdbc模板将n条记录插入到两个表中。有些人喜欢这个

假设正确配置了daos.xml。

ApplicationContext ctxt = new ClassPathXmlApplicationContext("daos.xml");
JdbcTemplate template = (JdbcTemplate) ctxt.getBean("jdbcTemplate");

final List<Person> list = new ArrayList<>();
        final List<Role> roles = new ArrayList<>();
        for(int i =1; i<=100; i++){
            Person item = new Person();
            item.setFirstName("Naveen" + i);
            item.setLastName("kumar" + i);
            item.setDescription("D" + i);
            list.add(item);

            Role role = new Role();
            role.setName("Admin");
            role.setCode("c"  + i);
            roles.add(role);

        }

String sql = "insert into person(first_name, last_name, description) values(?,?,?)";

            int[] arr = template.batchUpdate(sql, new BatchPreparedStatementSetter() {

                        @Override
                        public void setValues(PreparedStatement ps, int i) throws SQLException                             {
                            Person person = list.get(i);
                            ps.setObject(1, person.getFirstName());
                            ps.setObject(2, person.getLastName());
                            ps.setObject(3, person.getDescription());
                        }

                        @Override
                        public int getBatchSize() {
                            return list.size()
                        }
                    });

我也配置了事务管理器。

             

所以我的问题是如何使用批处理将数据插入到人员和角色表中。因为人可以有角色。当我插入人物时,它需要角色id插入在一起。在这种情况下,人物插入查询将如下所示。

String sql = "insert into person(first_name, last_name, description, role_id) values(?,?,?, ?)";

我想将其执行批量批处理。因为在我的情况下,我有最小的10k人名单来解析使用文件。因此,它可以成为一个性能杀手,我将角色插入表中而不是获取它并再次插入人物。

1 个答案:

答案 0 :(得分:5)

您可以使用多栏语句和LAST_INSERT_ID() MySql函数:

String sql = "insert into role(name, code) values(?,?);" +
    "insert into person(first_name, last_name, description, role_id) values(?,?,?,(SELECT LAST_INSERT_ID()));";

int[] arr = template.batchUpdate(sql, new BatchPreparedStatementSetter() {

    @Override
    public void setValues(PreparedStatement ps, int i) throws SQLException {
        Role role = roles.get(i);
        Person person = list.get(i);
        ps.setObject(1, role.getName());
        ps.setObject(2, role.getCode();
        ps.setObject(3, person.getFirstName());
        ps.setObject(4, person.getLastName());
        ps.setObject(5, person.getDescription());
    }

    @Override
    public int getBatchSize() {
        return list.size()
    }
});