Develope/DataBase

[MyBatis] 동적 쿼리문 만들기 (List<Map<>> insert, foreach)

고로이 2018. 5. 18. 15:50
반응형

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


http://vivi-world.tistory.com/entry/Mybatis-foreach-%EA%B5%AC%EB%AC%B8%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-Insert-%EB%8C%80%EB%9F%89-%EC%82%BD%EC%9E%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"
)

쿼리가  좀 더럽다 수정하기 귀찮다


반응형