我刚刚到
Spring,我试图插入一个List< Map< String,Object>>进桌子到目前为止,我一直在使用sqlParameterSource进行批量更新,当它提供了一个java bean时,这个工作正常.这样的事情
- @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,但它失败了(正确地).
上述代码失败,出现以下异常:
- 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)
它失败了,因为它认为列表是一批豆,我猜.我找不到一种在Spring中执行批量更新的方法,其中包含地图列表,并使用NamedParameterJDBCTemplate.请指教.
解决方法
根据Spring NamedParameterJDBCTemplate文档,找到
here,此方法可用于使用地图批量更新.
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;
- }