@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")); }
"Either an item can be mapped via db column or via bean spec, can't be both"); JdbcBatchItemWriter<T> writer = new JdbcBatchItemWriter<>(); writer.setSql(this.sql); writer.setAssertUpdates(this.assertUpdates); writer.setItemSqlParameterSourceProvider(this.itemSqlParameterSourceProvider); writer.setItemPreparedStatementSetter(this.itemPreparedStatementSetter); ((JdbcBatchItemWriter<Map<String,Object>>)writer).setItemPreparedStatementSetter(new ColumnMapItemPreparedStatementSetter()); } else if(mappedValue == 2) { writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()); writer.setJdbcTemplate(this.namedParameterJdbcTemplate);
@Before public void setUp() throws Exception { namedParameterJdbcOperations = mock(NamedParameterJdbcOperations.class); writer.setSql(sql); writer.setJdbcTemplate(namedParameterJdbcOperations); writer.setItemSqlParameterSourceProvider( new BeanPropertyItemSqlParameterSourceProvider<>()); writer.afterPropertiesSet(); }
@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(); }
@Bean public ItemWriter<WriterSO> writer(DataSource dataSource, ItemPreparedStatementSetter<WriterSO> setter) { JdbcBatchItemWriter<WriterSO> writer = new JdbcBatchItemWriter<>(); writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()); writer.setItemPreparedStatementSetter(setter); writer.setSql("insert into writer (id, full_name, random_num) values (?,?,?)"); writer.setDataSource(dataSource); return writer; }
@Bean ItemWriter<StudentDTO> xmlFileDatabaseItemWriter(DataSource dataSource, NamedParameterJdbcTemplate jdbcTemplate) { JdbcBatchItemWriter<StudentDTO> databaseItemWriter = new JdbcBatchItemWriter<>(); databaseItemWriter.setDataSource(dataSource); databaseItemWriter.setJdbcTemplate(jdbcTemplate); databaseItemWriter.setSql(QUERY_INSERT_STUDENT); ItemPreparedStatementSetter<StudentDTO> studentPreparedStatementSetter = new StudentPreparedStatementSetter(); databaseItemWriter.setItemPreparedStatementSetter(studentPreparedStatementSetter); return databaseItemWriter; }
@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(); }
@Test public void testWriteAndFlushWithFailure() throws Exception { final RuntimeException ex = new RuntimeException("bar"); writer.setItemPreparedStatementSetter(new ItemPreparedStatementSetter<String>() { @Override public void setValues(String item, PreparedStatement ps) throws SQLException { when(ps.executeBatch()).thenReturn(new int[] { 123 }); try { writer.write(Collections.singletonList("foo")); fail("Expected RuntimeException"); writer.setItemPreparedStatementSetter(new ItemPreparedStatementSetter<String>() { @Override public void setValues(String item, PreparedStatement ps) throws SQLException { writer.write(Collections.singletonList("foo")); assertEquals(4, list.size()); assertTrue(list.contains("SQL"));
@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 ItemWriter<StudentDTO> xmlFileDatabaseItemWriter(DataSource dataSource, NamedParameterJdbcTemplate jdbcTemplate) { JdbcBatchItemWriter<StudentDTO> databaseItemWriter = new JdbcBatchItemWriter<>(); databaseItemWriter.setDataSource(dataSource); databaseItemWriter.setJdbcTemplate(jdbcTemplate); databaseItemWriter.setSql(QUERY_INSERT_STUDENT); ItemPreparedStatementSetter<StudentDTO> studentPreparedStatementSetter = new StudentPreparedStatementSetter(); databaseItemWriter.setItemPreparedStatementSetter(studentPreparedStatementSetter); return databaseItemWriter; } @Bean
@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); }
@Bean ItemWriter<StudentDTO> csvFileDatabaseItemWriter(DataSource dataSource, NamedParameterJdbcTemplate jdbcTemplate) { JdbcBatchItemWriter<StudentDTO> databaseItemWriter = new JdbcBatchItemWriter<>(); databaseItemWriter.setDataSource(dataSource); databaseItemWriter.setJdbcTemplate(jdbcTemplate); databaseItemWriter.setSql(QUERY_INSERT_STUDENT); ItemSqlParameterSourceProvider<StudentDTO> sqlParameterSourceProvider = studentSqlParameterSourceProvider(); databaseItemWriter.setItemSqlParameterSourceProvider(sqlParameterSourceProvider); return databaseItemWriter; }
"Either an item can be mapped via db column or via bean spec, can't be both"); JdbcBatchItemWriter<T> writer = new JdbcBatchItemWriter<>(); writer.setSql(this.sql); writer.setAssertUpdates(this.assertUpdates); writer.setItemSqlParameterSourceProvider(this.itemSqlParameterSourceProvider); writer.setItemPreparedStatementSetter(this.itemPreparedStatementSetter); ((JdbcBatchItemWriter<Map<String,Object>>)writer).setItemPreparedStatementSetter(new ColumnMapItemPreparedStatementSetter()); } else if(mappedValue == 2) { writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()); writer.setJdbcTemplate(this.namedParameterJdbcTemplate);
@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(); }
@Bean ItemWriter<StudentDTO> csvFileDatabaseItemWriter(DataSource dataSource, NamedParameterJdbcTemplate jdbcTemplate) { JdbcBatchItemWriter<StudentDTO> databaseItemWriter = new JdbcBatchItemWriter<>(); databaseItemWriter.setDataSource(dataSource); databaseItemWriter.setJdbcTemplate(jdbcTemplate); databaseItemWriter.setSql(QUERY_INSERT_STUDENT); ItemSqlParameterSourceProvider<StudentDTO> sqlParameterSourceProvider = studentSqlParameterSourceProvider(); databaseItemWriter.setItemSqlParameterSourceProvider(sqlParameterSourceProvider); return databaseItemWriter; }
@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 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(); }
@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; }
/** * 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(); }