用Spring Batch實現了個簡單的需求,從MySQL中讀取用戶表數據,根據生日計算年齡,將結果輸出到csv文件。java
user test; DROP TABLE IF EXISTS `test_user`; CREATE TABLE `test_user` ( `id` int(11) NOT NULL auto_increment, `name` varchar(45) NOT NULL default '', `birthday` datetime default NULL, `age` int default 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; INSERT INTO test_user(name, birthday, age) VALUES('小明', '1993-03-09', 0); INSERT INTO test_user(name, birthday, age) VALUES('Jack', '1973-03-09', 0); INSERT INTO test_user(name, birthday, age) VALUES('Tom', '1963-03-09', 0); INSERT INTO test_user(name, birthday, age) VALUES('齊天大聖', '1983-03-09', 0); INSERT INTO test_user(name, birthday, age) VALUES('星知', '2003-03-09', 0);
public class TestUser { private Integer id; private String name; private Date birthday; private Integer age; // set/get... }
TestUserConfig.javamysql
@Bean public JdbcCursorItemReader<TestUser> itemReader(){ final DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://mysql-server:3306/test"); dataSource.setUsername("r00t"); dataSource.setPassword("r00t"); JdbcCursorItemReader<TestUser> reader = new JdbcCursorItemReader<TestUser>(); reader.setDataSource(dataSource); reader.setSql("SELECT id, name, birthday FROM test_user"); reader.setRowMapper(new UserRowMapper()); return reader; }
TestUserConfig.javagit
@Bean public TestUserItemProcessor itemProcessor() { return new TestUserItemProcessor(); }
TestUserItemProcessor.javaspring
public class TestUserItemProcessor implements ItemProcessor<TestUser, TestUser> { @Override public TestUser process(TestUser testUser) throws Exception { Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); cal1.setTime(testUser.getBirthday()); testUser.setAge(cal2.get(Calendar.YEAR) - cal1.get(Calendar.YEAR)); return testUser; } }
TestUserConfig.javasql
@Bean public FlatFileItemWriter<TestUser> itemWriter() { FlatFileItemWriter<TestUser> itemWriter = new FlatFileItemWriter<>(); String userHome = System.getProperty("user.home"); Resource outputResource = new FileSystemResource(userHome + "/output/demo04/test_user.csv"); itemWriter.setResource(outputResource); itemWriter.setLineAggregator(new DelimitedLineAggregator<TestUser>() {{ setDelimiter(","); setFieldExtractor(new BeanWrapperFieldExtractor<TestUser>() {{ setNames(new String[] { "id", "name", "age" }); }}); }}); return itemWriter; }
TestUserConfig.javashell
@Bean public Step step1(JdbcCursorItemReader<TestUser> itemReader, TestUserItemProcessor itemProcessor, FlatFileItemWriter<TestUser> itemWriter) { return steps.get("step1").<TestUser, TestUser> chunk(10) .reader(itemReader) .processor(itemProcessor) .writer(itemWriter) .build(); } @Bean public Job job1(Step step1) { return jobs.get("job1") .incrementer(new RunIdIncrementer()) .flow(step1) .end() .build(); }
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {TestUserConfig.class}) public class TestUserTest { @Autowired private JobLauncherTestUtils jobLauncherTestUtils; @Test public void givenTaskletsJob_whenJobEnds_thenStatusCompleted() throws Exception { JobExecution jobExecution = jobLauncherTestUtils.launchJob(); assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus()); } }
在用戶目錄下生成 C:\Users\{your-name}\output\demo04\test_user.csv
,文件內容以下app
6,小明,25 7,Jack,45 8,Tom,55 9,齊天大聖,35 10,星知,15
經過本例可瞭解Java配置SringBatch,讀取MySQL及寫入CSV等。本例完整實現 spring-batchide