http://vivi-world.tistory.com/entry/MyBatis-%EA%B0%9D%EC%B2%B4-VO-DTO-%EC%95%88%EC%9D%98-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C-%EC%9D%B8%EC%84%9C%ED%8A%B8-%EC%9E%91%EC%97%85%ED%95%98%EA%B8%B0?category=679678
쿼리문 수정은 끝이없구만
내가받는 csv 파일의 헤더가 컬럼이고 아래가 내용이더라..
vo 만들고 세팅해주기 귀찮아서 동적인 쿼리문을 만들었다. 예전에 비슷한짓을 한 기억이 있어 만들었다.
*결론
<insert id="insertEvaluation" parameterType="com.**.evaluation.vo.EvaConfVo">
INSERT INTO ${tableName}
(
<foreach item="value" index="key" collection="headerMap" separator=",">
${key}
</foreach>
) VALUES
<foreach item="item" index="key" collection="dataListMap" separator=",">
(
<foreach item="value" index="key" collection="item.entrySet()" separator=",">
"${value}"
</foreach>
)
</foreach>
</insert>
vo에서 테이블명을 받아오고
header는 리스트로 햇지만 뽑아내기 귀찮아서 맵을 걍 넣엇다.
아래 values는 Map의 값들을 하나하나 가져올것이다.
*VO
/**
* Created by eunbi on 2018. 5. 11.
*/
public class EvaConfVo {
private String id;
private String pointKey;
private String fileName;
private String filePath;
private String tableName;
private List<Map<String,String>> dataListMap;
private Map<String,String> headerMap;
public EvaConfVo() {
}
json 을 파싱할 Vo 이다
참고로 json은 아래와 같다
[
{
"ID": "공조기 가동",
"pointKey": "day",
"filename": "testModel1_20180511155548_1.csv",
"filepath": "/home/develope/eunbi/data/evaluation"
},
{
"ID": "절감율",
"pointKey": "day",
"filename": "testModel1_20180511155548_2.csv",
"filepath": "/home/develope/eunbi/data/evaluation"
}
]
id 에 따라 넣어야하는 테이블이 다르다.
그거슨 mapping 테이블을 하나 만들어서 처리했다.
** 파일내용
collect_time,floor,pt_Temperature,opt_TempDiff,opt_Status,WH_OFF1_Temperature,WH_OFF2_Temperature,WH_Status,Stop_Pred_Time,Stop_Temperature,Stop_Status
2018-05-21,1층,23,1,0,21,23,1,,21,1
2018-05-21,2층,22,-1,0,22,22,0,,23,0
* Csv Read
public List<Map<String, String>> readObjectsFromCsv(File file) throws IOException {
CsvSchema bootstrap = CsvSchema.emptySchema().withHeader();
CsvMapper csvMapper = new CsvMapper();
csvMapper.configure(CsvParser.Feature.IGNORE_TRAILING_UNMAPPABLE, true);
csvMapper.configure(CsvGenerator.Feature.ALWAYS_QUOTE_EMPTY_STRINGS, true);
MappingIterator<Map<String, String>> mappingIterator = csvMapper.readerFor(Map.class).with(bootstrap).readValues(file);
return mappingIterator.readAll();
}
어디선가 긁어온 csv read 함수이다.
맞다. 스키마 정의하기 싫어서 이렇게 했다.
*결과
** 파일내용
collect_time,floor,pt_Temperature,opt_TempDiff,opt_Status,WH_OFF1_Temperature,WH_OFF2_Temperature,WH_Status,Stop_Pred_Time,Stop_Temperature,Stop_Status
2018-05-21,1층,23,1,0,21,23,1,,21,1
2018-05-21,2층,22,-1,0,22,22,0,,23,0
** 쿼리 결과
INSERT INTO data_ahu_operation (
collect_time ,
floor ,
pt_Temperature ,
opt_TempDiff ,
opt_Status ,
WH_OFF1_Temperature ,
WH_OFF2_Temperature ,
WH_Status ,
Stop_Pred_Time ,
Stop_Temperature ,
Stop_Status
) VALUES (
"2018-05-21"
, "1층"
,
"23"
, "1"
, "0"
, "21"
, "23"
, "1"
, ""
, "21"
, "1"
) ,
(
"2018-05-21" ,
"2층" ,
"22" ,
"-1" ,
"0" ,
"22" ,
"22" ,
"0" ,
"" ,
"23" ,
"0"
)
쿼리가 좀 더럽다 수정하기 귀찮다
'Develope > DataBase' 카테고리의 다른 글
[Oracle] tomcat XDB 로그인 / 오라클 포트 변경 (2) | 2018.10.31 |
---|---|
[Oracle] 오라클의 공백문자와 null (0) | 2018.10.02 |
[MyBatis] 객체 (VO, DTO) 안의 리스트를 사용해서 인서트 작업하기 (0) | 2018.01.26 |
[MySQL] 바이너리 로그 분석하여 쿼리 조회하기. (0) | 2017.12.14 |
[SQL] 쿼리 튜닝 : select 문 안에 서브쿼리 (2) | 2017.12.01 |