如何使用NamedParameterJdbcTemplate进行批量插入

时间:2018-07-24 01:33:27

标签: java spring

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

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。这是因为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 个答案:

答案 0 :(得分:0)

如果您使用的是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);
相关问题