如何使用地图列表在Spring中执行批量更新? [英] How to perform batch update in Spring with a list of maps?
问题描述
Spring的新手,我试图在表格中插入列表< Map< String< String>>
。到目前为止,我一直在使用 SqlParameterSource
进行批量更新,这在向它们提供java bean时可以正常工作。这样的事情:
New to Spring, I am trying to insert a List<Map<String, Object>>
into a table. Until now I have been using the SqlParameterSource
for batch update, which works fine when a java bean is supplied to them. Something like this:
@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;
}
但是,我尝试了相同的技术和地图列表代替bean,它失败了(这是正确的)。
However, I tried the same technique with a list of maps in place of a bean, it failed (rightly so).
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;
}
上述代码失败,出现以下异常:
The above code failed with the following exception:
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)
我认为它失败了,因为它认为列表是一批bean。我找不到在Spring中使用地图列表并使用 NamedParameterJDBCTemplate
执行批量更新的方法。请建议。
It fails as it considers the list to be a batch of beans, I guess. I cannot find a way to perform a batch update in Spring with a list of maps and using NamedParameterJDBCTemplate
. Please advice.
推荐答案
根据Spring NamedParameterJDBCTemplate
docs,找到这里 ,此方法可用于使用地图进行批量更新。
As per Spring NamedParameterJDBCTemplate
docs, found here, this method can be used for batch updating with maps.
int [] batchUpdate(String sql,Map< String,?> [] batchValues)
真正的挑战是从相应的获取
。我使用以下代码来获取数组并执行批量更新。 Map< String,Object>
的数组列表< Map< String,Object>>
The real challange was to a get an array of Map<String, Object>
from a corresponding List<Map<String, Object>>
. I used the following code to get the array and perform the batch update.
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;
}
这篇关于如何使用地图列表在Spring中执行批量更新?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!