@SuppressWarnings({ "rawtypes", "serial", "unchecked" }) @Test public void testWriteAndFlushMap() throws Exception { JdbcBatchItemWriter<Map<String, Object>> mapWriter = new JdbcBatchItemWriter<>(); mapWriter.setSql(sql); mapWriter.setJdbcTemplate(namedParameterJdbcOperations); mapWriter.afterPropertiesSet(); ArgumentCaptor<Map []> captor = ArgumentCaptor.forClass(Map[].class); when(namedParameterJdbcOperations.batchUpdate(eq(sql), captor.capture())) .thenReturn(new int[] {1}); mapWriter.write(Collections.singletonList(new HashMap<String, Object>() {{put("foo", "bar");}})); assertEquals(1, captor.getValue().length); Map<String, Object> results = captor.getValue()[0]; assertEquals("bar", results.get("foo")); }
/** * Test method for * {@link org.springframework.batch.item.database.JdbcBatchItemWriter#afterPropertiesSet()} * . */ @Test public void testAfterPropertiesSet() throws Exception { writer = new JdbcBatchItemWriter<>(); try { writer.afterPropertiesSet(); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // expected String message = e.getMessage(); assertTrue("Message does not contain 'NamedParameterJdbcTemplate'.", message.contains("NamedParameterJdbcTemplate")); } writer.setJdbcTemplate(namedParameterJdbcOperations); try { writer.afterPropertiesSet(); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // expected String message = e.getMessage().toLowerCase(); assertTrue("Message does not contain 'sql'.", message.contains("sql")); } writer.setSql("select * from foo where id = :id"); writer.afterPropertiesSet(); }
@Test public void testCustomPreparedStatementSetter() throws Exception { JdbcBatchItemWriter<Map<String, Object>> writer = new JdbcBatchItemWriterBuilder<Map<String, Object>>() .itemPreparedStatementSetter((item, ps) -> { ps.setInt(0, (int) item.get("first")); ps.setString(1, (String) item.get("second")); ps.setString(2, (String) item.get("third")); }) .dataSource(this.dataSource) .sql("INSERT INTO FOO (first, second, third) VALUES (:first, :second, :third)") .build(); writer.afterPropertiesSet(); List<Map<String, Object>> items = buildMapItems(); writer.write(items); verifyWrite(); }
@Before public void setUp() throws Exception { namedParameterJdbcOperations = mock(NamedParameterJdbcOperations.class); writer.setSql(sql); writer.setJdbcTemplate(namedParameterJdbcOperations); writer.setItemSqlParameterSourceProvider( new BeanPropertyItemSqlParameterSourceProvider<>()); writer.afterPropertiesSet(); }
writer = new JdbcBatchItemWriter<>(); try { writer.afterPropertiesSet(); fail("Expected IllegalArgumentException"); writer.afterPropertiesSet(); fail("Expected IllegalArgumentException"); writer.afterPropertiesSet(); fail("Expected IllegalArgumentException"); writer.afterPropertiesSet();
@SuppressWarnings({ "rawtypes", "serial", "unchecked" }) @Test public void testWriteAndFlushMapWithItemSqlParameterSourceProvider() throws Exception { JdbcBatchItemWriter<Map<String, Object>> mapWriter = new JdbcBatchItemWriter<>(); mapWriter.setSql(sql); mapWriter.setJdbcTemplate(namedParameterJdbcOperations); mapWriter.setItemSqlParameterSourceProvider(new ItemSqlParameterSourceProvider<Map<String, Object>>() { @Override public SqlParameterSource createSqlParameterSource(Map<String, Object> item) { return new MapSqlParameterSource(item); } }); mapWriter.afterPropertiesSet(); ArgumentCaptor<SqlParameterSource []> captor = ArgumentCaptor.forClass(SqlParameterSource[].class); when(namedParameterJdbcOperations.batchUpdate(any(String.class), captor.capture())) .thenReturn(new int[] {1}); mapWriter.write(Collections.singletonList(new HashMap<String, Object>() {{put("foo", "bar");}})); assertEquals(1, captor.getValue().length); SqlParameterSource results = captor.getValue()[0]; assertEquals("bar", results.getValue("foo")); }
@Test public void testBasicPojo() throws Exception { JdbcBatchItemWriter<Foo> writer = new JdbcBatchItemWriterBuilder<Foo>() .beanMapped() .dataSource(this.dataSource) .sql("INSERT INTO FOO (first, second, third) VALUES (:first, :second, :third)") .build(); writer.afterPropertiesSet(); List<Foo> items = new ArrayList<>(3); items.add(new Foo(1, "two", "three")); items.add(new Foo(4, "five", "six")); items.add(new Foo(7, "eight", "nine")); writer.write(items); verifyWrite(); }
@Test(expected = EmptyResultDataAccessException.class) public void testAssertUpdates() throws Exception { JdbcBatchItemWriter<Foo> writer = new JdbcBatchItemWriterBuilder<Foo>() .beanMapped() .dataSource(this.dataSource) .sql("UPDATE FOO SET second = :second, third = :third WHERE first = :first") .assertUpdates(true) .build(); writer.afterPropertiesSet(); List<Foo> items = new ArrayList<>(1); items.add(new Foo(1, "two", "three")); writer.write(items); }
@Before public void setUp() throws Exception { ps = mock(PreparedStatement.class); jdbcTemplate = new JdbcTemplate() { @Override public <T> T execute(String sql, PreparedStatementCallback<T> action) throws DataAccessException { list.add(sql); try { return action.doInPreparedStatement(ps); } catch (SQLException e) { throw new UncategorizedSQLException("doInPreparedStatement", sql, e); } } }; writer.setSql("SQL"); writer.setJdbcTemplate(new NamedParameterJdbcTemplate(jdbcTemplate)); writer.setItemPreparedStatementSetter(new ItemPreparedStatementSetter<String>() { @Override public void setValues(String item, PreparedStatement ps) throws SQLException { list.add(item); } }); writer.afterPropertiesSet(); }
@Test public void testBasicMap() throws Exception { JdbcBatchItemWriter<Map<String, Object>> writer = new JdbcBatchItemWriterBuilder<Map<String, Object>>() .columnMapped() .dataSource(this.dataSource) .sql("INSERT INTO FOO (first, second, third) VALUES (:first, :second, :third)") .build(); writer.afterPropertiesSet(); List<Map<String, Object>> items = buildMapItems(); writer.write(items); verifyWrite(); }
@Test public void testCustomPSqlParameterSourceProvider() throws Exception { JdbcBatchItemWriter<Map<String, Object>> writer = new JdbcBatchItemWriterBuilder<Map<String, Object>>() .itemSqlParameterSourceProvider(MapSqlParameterSource::new) .dataSource(this.dataSource) .sql("INSERT INTO FOO (first, second, third) VALUES (:first, :second, :third)") .build(); writer.afterPropertiesSet(); List<Map<String, Object>> items = buildMapItems(); writer.write(items); verifyWrite(); }
@Test public void testCustomJdbcTemplate() throws Exception { NamedParameterJdbcOperations template = new NamedParameterJdbcTemplate(this.dataSource); JdbcBatchItemWriter<Map<String, Object>> writer = new JdbcBatchItemWriterBuilder<Map<String, Object>>() .columnMapped() .namedParametersJdbcTemplate(template) .sql("INSERT INTO FOO (first, second, third) VALUES (:first, :second, :third)") .build(); writer.afterPropertiesSet(); List<Map<String, Object>> items = buildMapItems(); writer.write(items); verifyWrite(); Object usedTemplate = ReflectionTestUtils.getField(writer, "namedParameterJdbcTemplate"); assertTrue(template == usedTemplate); }
@Override public void afterPropertiesSet() { Assert.notEmpty(names, "columnNames must be set"); StringBuilder columns = new StringBuilder(); StringBuilder namedParams = new StringBuilder(); for (String column : names) { if (columns.length() > 0) { columns.append(", "); namedParams.append(", "); } columns.append(column); namedParams.append(":").append(column.trim()); } setSql("insert into " + tableName + "(" + columns.toString() + ") values (" + namedParams.toString() + ")"); super.afterPropertiesSet(); } }
@Bean public JdbcBatchItemWriter<Customer> customerItemWriter() { JdbcBatchItemWriter<Customer> itemWriter = new JdbcBatchItemWriter<>(); itemWriter.setDataSource(this.dataSource); itemWriter.setSql("INSERT INTO NEW_CUSTOMER VALUES (:id, :firstName, :lastName, :birthdate)"); itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); itemWriter.afterPropertiesSet(); return itemWriter; }
@Bean public JdbcBatchItemWriter customerItemWriter() { JdbcBatchItemWriter<Customer> itemWriter = new JdbcBatchItemWriter<>(); itemWriter.setDataSource(this.dataSource); itemWriter.setSql("INSERT INTO NEW_CUSTOMER VALUES (:id, :firstName, :lastName, :birthdate)"); itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); itemWriter.afterPropertiesSet(); return itemWriter; }
@Bean public JdbcBatchItemWriter<Customer> customerItemWriter() { JdbcBatchItemWriter<Customer> itemWriter = new JdbcBatchItemWriter<>(); itemWriter.setDataSource(this.dataSource); itemWriter.setSql("INSERT INTO NEW_CUSTOMER VALUES (:id, :firstName, :lastName, :birthdate)"); itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); itemWriter.afterPropertiesSet(); return itemWriter; }
@Bean public JdbcBatchItemWriter<Customer> customerItemWriter() { JdbcBatchItemWriter<Customer> itemWriter = new JdbcBatchItemWriter<>(); itemWriter.setDataSource(this.dataSource); itemWriter.setSql("INSERT INTO CUSTOMER VALUES (:id, :firstName, :lastName, :birthdate)"); itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); itemWriter.afterPropertiesSet(); return itemWriter; }
@Bean @StepScope public JdbcBatchItemWriter<Customer> customerItemWriter() { JdbcBatchItemWriter<Customer> itemWriter = new JdbcBatchItemWriter<>(); itemWriter.setDataSource(this.dataSource); itemWriter.setSql("INSERT INTO NEW_CUSTOMER VALUES (:id, :firstName, :lastName, :birthdate)"); itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); itemWriter.afterPropertiesSet(); return itemWriter; }
@Bean @StepScope public JdbcBatchItemWriter<Customer> customerItemWriter() { JdbcBatchItemWriter<Customer> itemWriter = new JdbcBatchItemWriter<>(); itemWriter.setDataSource(this.dataSource); itemWriter.setSql("INSERT INTO NEW_CUSTOMER VALUES (:id, :firstName, :lastName, :birthdate)"); itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); itemWriter.afterPropertiesSet(); return itemWriter; }