복붙노트

[SPRING] 지도 목록으로 Spring에서 배치 업데이트를 수행하는 방법은 무엇입니까?

SPRING

지도 목록으로 Spring에서 배치 업데이트를 수행하는 방법은 무엇입니까?

새로운 스프링에 List >를 테이블에 삽입하려고합니다. 지금까지 일괄 업데이트를 위해 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;

        }

그러나 빈 대신에 맵 목록을 사용하여 동일한 기술을 시도했지만 실패했습니다 (맞습니다).

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을 사용하여 Spring에서 일괄 업데이트를 수행하는 방법을 찾을 수 없습니다. 제발 조언.

해결법

  1. ==============================

    1.Spring NamedParameterJDBCTemplate 문서에서 볼 수 있듯이,이 메소드는 맵을 사용하여 배치를 업데이트하는 데 사용할 수 있습니다.

    Spring NamedParameterJDBCTemplate 문서에서 볼 수 있듯이,이 메소드는 맵을 사용하여 배치를 업데이트하는 데 사용할 수 있습니다.

    int [] batchUpdate (String sql, Map [] 배치 값)

    실제 과제는 해당 List >에서 Map 배열을 가져 오는 것이 었습니다. 다음 코드를 사용하여 배열을 가져오고 배치 업데이트를 수행했습니다.

    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. ==============================

    2.나는 코드로 테스트했다.

    나는 코드로 테스트했다.

    Map<String, Object>[] rs = new Map<String, Object>[1];
    
    Map<String, Object> item1 = new HashMap<>();
    item1.put("name", "Tien Nguyen");
    item1.put("age", 35);
    rs[0] = item1;
    
    NamedParameterJdbcTemplate jdbc = new NamedParameterJdbcTemplate(datasource); 
    // datasource from JDBC.
    jdbc.batchUpdate("call sp(:name, :age)", rs);
    

    희망은 알기 쉽다. 감사

  3. from https://stackoverflow.com/questions/17422674/how-to-perform-batch-update-in-spring-with-a-list-of-maps by cc-by-sa and MIT license