java – 如何使用地图列表在Spring中执行批量更新?

前端之家收集整理的这篇文章主要介绍了java – 如何使用地图列表在Spring中执行批量更新?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚刚到 Spring,我试图插入一个List< Map< String,Object>>进桌子到目前为止,我一直在使用sqlParameterSource进行批量更新,当它提供了一个java bean时,这个工作正常.这样的事情
  1. @Autowired
  2. private NamedParameterJDBCTemplate v2_template;
  3.  
  4. public int[] bulkInsertIntoSiteTable(List<SiteBean> list){
  5. sqlParameterSource[] batch = sqlParameterSourceUtils
  6. .createBatch(list.toArray());
  7. int[] updateCounts = v2_template
  8. .batchUpdate(
  9. "insert into sitestatus (website,status,createdby) values (:website,:status,:username)",batch);
  10.  
  11. return updateCounts;
  12.  
  13. }

然而,我尝试使用与地图列表相同的技术来代替一个bean,但它失败了(正确地).

  1. public int[] bulkInsertIntoSiteTable(List<Map<String,Object>> list){
  2. sqlParameterSource[] batch = sqlParameterSourceUtils
  3. .createBatch(list.toArray());
  4. int[] updateCounts = v2_template
  5. .batchUpdate(
  6. "insert into sitestatus (website,batch);
  7.  
  8. return updateCounts;
  9.  
  10. }

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

  1. 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?
  2. at org.springframework.jdbc.core.namedparam.NamedParameterUtils.buildValueArray(NamedParameterUtils.java:322)
  3. at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils$1.setValues(NamedParameterBatchUpdateUtils.java:45)
  4. at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:893)
  5. at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:1)
  6. at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
  7. at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:615)
  8. at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:884)
  9. at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils.executeBatchUpdateWithNamedParameters(NamedParameterBatchUpdateUtils.java:40)
  10. at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchUpdate(NamedParameterJdbcTemplate.java:303)
  11. at tester.utitlies.dao.VersionTwoDao.bulkInsertIntoSites(VersionTwoDao.java:21)
  12. at tester.utitlies.runner.Main.main(Main.java:28)

它失败了,因为它认为列表是一批豆,我猜.我找不到一种在Spring中执行批量更新的方法,其中包含地图列表,并使用NamedParameterJDBCTemplate.请指教.

解决方法

根据Spring NamedParameterJDBCTemplate文档,找到 here,此方法可用于使用地图批量更新.

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

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

  1. public static Map<String,Object>[] getArrayData(List<Map<String,Object>> list){
  2. @SuppressWarnings("unchecked")
  3. Map<String,Object>[] maps = new HashMap[list.size()];
  4.  
  5. Iterator<Map<String,Object>> iterator = list.iterator();
  6. int i = 0;
  7. while (iterator.hasNext()) {
  8. Map<java.lang.String,java.lang.Object> map = (Map<java.lang.String,java.lang.Object>) iterator
  9. .next();
  10. maps[i++] = map;
  11. }
  12.  
  13. return maps;
  14. }

猜你在找的Java相关文章