代码之家  ›  专栏  ›  技术社区  ›  Julian

如何将NamedParameterJDBCTemplate用于批插入

  •  0
  • Julian  · 技术社区  · 6 年前

    我正在使用spring-namedparameterjdbtemplate将记录批量插入数据库表中。

    CREATE TABLE test (x number);
    

    我的知识库类是这样的:

    @Repository
    public class TestRepository {
        private static final String TEMP_INSERT = "INSERT INTO test(x) VALUES (:x)";
    
        @Autowired
        private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
    
        public int batchTestInsert(SqlParameterSource[] parameters) {
            return Arrays.stream(
                namedParameterJdbcTemplate.batchUpdate(TEMP_INSERT, parameters)
            ).sum();
        }
    }
    

    插入执行正常,但返回的结果是意外的负值-6。这是因为数组中的每个元素都返回bu namedParameterJdbcTemplate 等于-2。

    我的问题是我误解了使用这个Spring模板的方法,或者它是一个Spring bug(很难相信)。如果我使用不当,正确的方法是什么?

    下面是重现问题的单元测试:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes=MyConfiguration.class)
    public class TestRepositoryTest {
        @Autowired
        private TestRepository repository;
    
        @Test
        public void shoudReturnTheNumberOfInsertedRecords() {
            assertEquals(3, repository.batchTestInsert(new SqlParameterSource[] {
                    new MapSqlParameterSource("x", 1),
                    new MapSqlParameterSource("x", 2),
                    new MapSqlParameterSource("x", 3)
            }));
        }
    }
    
    
    java.lang.AssertionError: 
    Expected :3
    Actual   :-6
    <Click to see difference>
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Ivan    6 年前

    如果您使用的是Oracle数据库,那么-2意味着SQL语句已成功执行,但有关受影响的确切行的信息不可用。( ExecuteBatch method return array of value -2 in java )

    测试可以插入多少行 namedJdbcTemplate 执行 SELECT 陈述并检查其结果。

    你需要注射

    @Autowired
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
    

    进入测试类,然后使用它查询数据库。

    Integer count = namedParameterJdbcTemplate.queryForObject("SELECT COUNT(1) FROM test", new HashMap<String, Object>, Integer.class); //I pass empty HashMap since query doesn't need parameters
    assertEquals(3, count);