如何在春季使用地图列表进行批量更新?

春天的新手,我正在尝试将一个插入到表格中。到目前为止,我一直在使用批量更新,当向他们提供java bean时,它可以正常工作。像这样:List<Map<String, Object>>SqlParameterSource

    @Autowired
    private NamedParameterJDBCTemplate v2_template;

    public int[] bulkInsertIntoSiteTable(List<SiteBean> list){
            SqlParameterSource[] batch = SqlParameterSourceUtils
                    .createBatch(list.toArray());
            int[] updateCounts = v2_template
                    .batchUpdate(
                            "insert into sitestatus (website, status, createdby) values (:website, :status, :username)",
                            batch);

            return updateCounts;

        }

但是,我尝试了相同的技术,用地图列表代替豆子,它失败了(这是正确的)。

public int[] bulkInsertIntoSiteTable(List<Map<String, Object>> list){
        SqlParameterSource[] batch = SqlParameterSourceUtils
                .createBatch(list.toArray());
        int[] updateCounts = v2_template
                .batchUpdate(
                        "insert into sitestatus (website, status, createdby) values (:website, :status, :username)",
                        batch);

        return updateCounts;

    }

上述代码失败,出现以下异常:

Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the SQL parameter 'website': Invalid property 'website' of bean class [org.springframework.util.LinkedCaseInsensitiveMap]: Bean property 'website' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    at org.springframework.jdbc.core.namedparam.NamedParameterUtils.buildValueArray(NamedParameterUtils.java:322)
    at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils$1.setValues(NamedParameterBatchUpdateUtils.java:45)
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:893)
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:1)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:615)
    at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:884)
    at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils.executeBatchUpdateWithNamedParameters(NamedParameterBatchUpdateUtils.java:40)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchUpdate(NamedParameterJdbcTemplate.java:303)
    at tester.utitlies.dao.VersionTwoDao.bulkInsertIntoSites(VersionTwoDao.java:21)
    at tester.utitlies.runner.Main.main(Main.java:28)

它失败了,因为它认为这个列表是一批豆子,我猜。我找不到一种方法在春季使用地图列表并使用.请指教。NamedParameterJDBCTemplate


答案 1

根据此处的Spring文档,此方法可用于使用地图进行批量更新。NamedParameterJDBCTemplate

int[] batchUpdate(String sql, Map<String,?>[] batchValues)

真正的挑战是从相应的 .我使用以下代码来获取数组并执行批量更新。Map<String, Object>List<Map<String, Object>>

public static Map<String, Object>[] getArrayData(List<Map<String, Object>> list){
        @SuppressWarnings("unchecked")
        Map<String, Object>[] maps = new HashMap[list.size()];

        Iterator<Map<String, Object>> iterator = list.iterator();
        int i = 0;
        while (iterator.hasNext()) {
            Map<java.lang.String, java.lang.Object> map = (Map<java.lang.String, java.lang.Object>) iterator
                    .next();
            maps[i++] = map;
        }

        return maps;
    }

答案 2

您不能在 NamedParameterJdbcTemplate 的 batchUpdate 中直接使用您的 Bean,NamedParameterJdbcTemplate 的 batchUpdate 仅接受数组形式的参数。SqlParameterSource 的数组或 Map 的数组。

在这里,我将演示如何使用Map数组来实现您的目标。

考虑到上述问题,将你的 List of Bean 转换为 map 数组,每个 map 对应于一行要插入或 One Bean 对象,字段及其值存储在映射内,其中 key 是字段名称,值是所考虑的字段的值。

@Autowired
private NamedParameterJDBCTemplate v2_template;

public int[] bulkInsertIntoSiteTable(List<SiteBean> list){
        String yourQuery = "insert into sitestatus (website, status, createdby) 
               values (:website, :status, :username)"
        
        Map<String,Object>[] batchOfInputs = new HashMap[list.size()];
        int count = 0;
        for(SiteBean sb : list.size()){
           Map<String,Object> map = new HashMap();
           map.put("website",sb.getWebsite());
           map.put("status",sb.getStatus());
           map.put("username",sb.getUsername());
           batchOfInputs[count++]= map;
        }
        int[] updateCounts = v2_template.batchUpdate(yourQuery,batchOfInputs);

        return updateCounts;

    }

推荐