Java 如何使用NamedParameterJdbcTemplate进行批插入

Java 如何使用NamedParameterJdbcTemplate进行批插入,java,spring,Java,Spring,我使用SpringNamedParameterJDBCTemplate将记录批量插入数据库表 CREATE TABLE test (x number); 我的存储库类是这样的: @Repository public class TestRepository { private static final String TEMP_INSERT = "INSERT INTO test(x) VALUES (:x)"; @Autowired private NamedPara

我使用SpringNamedParameterJDBCTemplate将记录批量插入数据库表

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>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(class=MyConfiguration.class)
公共类TestRepositoryTest{
@自动连线
私有测试库;
@试验
public void应返回插入记录的编号(){
assertEquals(3,repository.batchTestInsert(新的SqlParameterSource[]{
新的MapSqlParameterSource(“x”,1),
新的MapSqlParameterSource(“x”,2),
新的MapSqlParameterSource(“x”,3)
}));
}
}
java.lang.AssertionError:
预期:3
实际:-6

如果您使用的是Oracle数据库,则-2表示SQL语句已成功执行,但有关受影响的确切行的信息不可用()

要测试插入了多少行,可以使用
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);
Integer count=namedParameterJdbcTemplate.queryForObject(“从测试中选择count(1)”,新建HashMap,Integer.class)//我传递空HashMap,因为查询不需要参数
资产质量(3,计数);

如果您使用的是Oracle数据库,则-2表示SQL语句已成功执行,但有关受影响的确切行的信息不可用()

要测试插入了多少行,可以使用
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);
Integer count=namedParameterJdbcTemplate.queryForObject(“从测试中选择count(1)”,新建HashMap,Integer.class)//我传递空HashMap,因为查询不需要参数
资产质量(3,计数);