아 입력만 하는 목적이라는 Map을 사용할만도 합니다.
Map을 사용하는 FieldSetMapper를 아래와 같이 만들어둔게 있어요. (플랫파일에서 읽어서 입력만 하고 끝나는 거라서 type은 무조건 String으로 했었습니다;)
public class MapFieldSetMapper implements FieldSetMapper<Map<String,String>>{
private String[] columnNames;
private Map<String,String> defaultValues;
public void setColumnNames(String[] columnNames) {
this.columnNames = columnNames;
}
public void setDefaultValues(Map<String, String> defaultValues) {
this.defaultValues = defaultValues;
}
public Map<String, String> mapFieldSet(FieldSet fieldSet) {
Map<String,String> item = new HashMap<String,String>();
for(int i=0,n= columnNames.length;i<n;i++){
String name = columnNames[i];
String value = fieldSet.readString(i);
if(StringUtils.isEmpty(value) && defaultValues !=null ){
String defaultValue = defaultValues.get(name);
if(defaultValue!=null){
value = defaultValue;
}
}
item.put(name, value);
}
return item;
}
}
public class MapFieldSetMapperTest {
MapFieldSetMapper mapper = new MapFieldSetMapper();
@Before
public void setUp(){
String[] names = new String[]{"id","desc","status"};
mapper.setColumnNames(names);
}
@Test
public void testNonDefaultValue(){
String[] values = new String[]{"stock","",null};
FieldSet fs = new DefaultFieldSet(values);
Map<String, String> item = mapper.mapFieldSet(fs);
System.out.println(item);
assertEquals("stock",item.get("id"));
assertEquals("",item.get("desc"));
assertNull(item.get("status"));
}
@Test
public void testDefaultValue(){
String[] values = new String[]{"stock","",null};
Map<String,String> defaultValues = new HashMap<String,String>();
defaultValues.put("desc", "0");
defaultValues.put("status", "1");
mapper.setDefaultValues(defaultValues);
FieldSet fs = new DefaultFieldSet(values);
Map<String, String> item = mapper.mapFieldSet(fs);
System.out.println(item);
assertEquals("stock",item.get("id"));
assertEquals("0",item.get("desc"));
assertEquals("1",item.get("status"));
}
}
여기에서는 field값이 null일 경우 default value까지 지정해주는 기능까지 만들어서 코드가 좀 길어졌는데, 단순히 map에서 매핑한 한다면 더 간단할 거에요~
그리고 DB에 입력할때 JdbcItemWriter에 아래와 같이 ItemSqlParameterSourceProvider를 이용해서 Map에서 파라미터를 읽게 오게 할 수 있구요
JdbcBatchItemWriter<Map<String, String>> writer = new JdbcBatchItemWriter<Map<String, String>>();
writer.setDataSource(dataSource);
writer.setSql(...);
ItemSqlParameterSourceProvider<Map<String, String>> parameterProvider = new ItemSqlParameterSourceProvider<Map<String, String>>() {
public SqlParameterSource createSqlParameterSource(
Map<String, String> item) {
return new MapSqlParameterSource(item);
}
};
writer.setItemSqlParameterSourceProvider(parameterProvider);
이런 설정을 SimpleStepFactoryBean 확장한 클래스를 이용해서 단순하게도 만들 수 있습니다. 저는 이런 단순입력의 경우에 쿼리도 자동으로 만들어주는 기능까지 만들어서 플랫파일에 있는 순서대로의 컬럼명과 컬럼명만 파라미터로 넣으면 되게 하기도 했었습니다.
(설명이 대충인데, 필요하신 부분을 말씀하시면 나중에 더 자세한 설명을 달아드리겠습니다;)