Skip to content

Commit

Permalink
Got writing working (Sort of)
Browse files Browse the repository at this point in the history
  • Loading branch information
MikeyAlmighty committed Mar 29, 2024
1 parent 36948a7 commit 50483bf
Show file tree
Hide file tree
Showing 10 changed files with 92 additions and 84 deletions.
4 changes: 4 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@
<artifactId>spring-batch-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package com.example.newyorkbabies.configuration;

import com.example.newyorkbabies.model.BabyDto;
import com.example.newyorkbabies.model.Baby;
import com.example.newyorkbabies.processor.CSVItemProcessor;
import com.example.newyorkbabies.repository.BabyRepository;
import com.example.newyorkbabies.writer.CSVItemWriter;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.data.RepositoryItemWriter;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.LineMapper;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
Expand All @@ -37,46 +37,53 @@ public CSVImporterJob(CSVItemProcessor csvItemProcessor, BabyRepository babyRepo
public Job job(JobRepository jobRepository, PlatformTransactionManager platformTransactionManager) {
return new JobBuilder("CSVImporterJob", jobRepository)
.incrementer(new RunIdIncrementer())
.start(chunkStep(jobRepository, platformTransactionManager))
.build();
.flow(chunkStep(jobRepository, platformTransactionManager))
.end().build();
}

@Bean
public Step chunkStep(JobRepository jobRepository, PlatformTransactionManager platformTransactionManager) {
return new StepBuilder("First Chunk", jobRepository)
.<BabyDto, BabyDto>chunk(3, platformTransactionManager)
.<Baby, Baby>chunk(5, platformTransactionManager)
.reader(flatFileItemReader())
.processor(csvItemProcessor)
.writer(writer())
.writer(itemWriter())
.build();
}

public FlatFileItemReader<BabyDto> flatFileItemReader() {
FlatFileItemReader<BabyDto> flatFileItemReader = new FlatFileItemReader<BabyDto>();

flatFileItemReader.setResource(new FileSystemResource(new File(("/home/mikey/Dev/new-york-babies/src/main/resources/Popular_Baby_Names.csv"))));
flatFileItemReader.setLineMapper(new DefaultLineMapper<>() {
{
setLineTokenizer(new DelimitedLineTokenizer() {
{
setNames("Year Of Birth", "Gender", "Ethnicity", "First Name", "Count", "Rank");
}
});
setFieldSetMapper(new BeanWrapperFieldSetMapper<BabyDto>() {
{
setTargetType(BabyDto.class);
}
});
}
});

flatFileItemReader.setLinesToSkip(1);
flatFileItemReader.setStrict(false);

return flatFileItemReader;
public FlatFileItemReader<Baby> flatFileItemReader() {
FlatFileItemReader<Baby> itemReader = new FlatFileItemReader<>();

itemReader.setResource(new FileSystemResource(new File(("/home/mikey/Dev/new-york-babies/src/main/resources/Popular_Baby_Names.csv"))));
itemReader.setName("csvReader");
itemReader.setLinesToSkip(1);
itemReader.setLineMapper(lineMapper());

return itemReader;
}

private ItemWriter<? super BabyDto> writer() {
return babyRepository::saveAll;
private LineMapper<Baby> lineMapper() {
DefaultLineMapper<Baby> lineMapper = new DefaultLineMapper<>();
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();

lineTokenizer.setDelimiter(",");
lineTokenizer.setStrict(false);
lineTokenizer.setNames("Year Of Birth", "Gender", "Ethnicity", "First Name", "Count", "Score");

BeanWrapperFieldSetMapper<Baby> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
fieldSetMapper.setTargetType(Baby.class);

lineMapper.setLineTokenizer(lineTokenizer);
lineMapper.setFieldSetMapper(fieldSetMapper);

return lineMapper;
}

@Bean
public RepositoryItemWriter<Baby> itemWriter() {
RepositoryItemWriter<Baby> writer = new RepositoryItemWriter<>();
writer.setRepository(babyRepository);
writer.setMethodName("save");
return writer;
}
}
37 changes: 37 additions & 0 deletions src/main/java/com/example/newyorkbabies/model/Baby.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.example.newyorkbabies.model;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "baby_info")
public class Baby {
@Id

@Column(name = "YEAR_OF_BIRTH")
private int yearOfBirth;

@Column(name = "GENDER")
private String gender;

@Column(name = "ETHNICITY")
private String ethnicity;

@Column(name = "FIRST_NAME")
private String firstName;

@Column(name = "COUNT")
private Integer count;

@Column(name = "SCORE")
private Integer score;
}

20 changes: 0 additions & 20 deletions src/main/java/com/example/newyorkbabies/model/BabyDto.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package com.example.newyorkbabies.processor;

import com.example.newyorkbabies.model.BabyDto;
import com.example.newyorkbabies.model.Baby;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.stereotype.Component;

@Component
public class CSVItemProcessor implements ItemProcessor<BabyDto, BabyDto> {
public class CSVItemProcessor implements ItemProcessor<Baby, Baby> {

@Override
public BabyDto process(BabyDto record) throws Exception {
System.out.println("BabyRecord: " + record.getFirstName());
return null;
public Baby process(Baby record) throws Exception {
System.out.println("BabyRecord: " + record.toString());
return record;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.example.newyorkbabies.repository;

import com.example.newyorkbabies.model.BabyDto;
import com.example.newyorkbabies.model.Baby;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface BabyRepository extends JpaRepository<BabyDto,Long> { }
public interface BabyRepository extends JpaRepository<Baby,Long> { }
14 changes: 0 additions & 14 deletions src/main/java/com/example/newyorkbabies/writer/CSVItemWriter.java

This file was deleted.

2 changes: 1 addition & 1 deletion src/main/resources/Popular_Baby_Names.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Year of Birth,Gender,Ethnicity,First Name,Count,Rank
Year of Birth,Gender,Ethnicity,First Name,Count,Score
2011,FEMALE,HISPANIC,GERALDINE,13,75
2011,FEMALE,HISPANIC,GIA,21,67
2011,FEMALE,HISPANIC,GIANNA,49,42
Expand Down
6 changes: 4 additions & 2 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ spring.application.name=new-york-babies
#
# JDBC properties
#
spring.datasource.url=jdbc:mysql://172.17.0.2:3306/spring_batch
spring.datasource.url=jdbc:mysql://172.17.0.2:3306/newYorkBabies
spring.datasource.username=root
spring.datasource.password=CelineDion420
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#
# Batch
#
spring.batch.jdbc.initialize-schema=always
spring.batch.job.enabled=false

spring.batch.jdbc.initialize-schema=always
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

0 comments on commit 50483bf

Please sign in to comment.