簡體   English   中英

如何使用NamedParameterJdbcTemplate進行批量插入

[英]How to use NamedParameterJdbcTemplate for batch inserts

我正在使用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>

如果使用的是Oracle數據庫,則-2表示SQL語句已成功執行,但是有關受影響的確切行的信息不可用( ExecuteBatch方法在Java中返回值-2的數組

要測試插入了多少行,可以使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM