SQL 쿼리문 만들기
Insert Query Example
INSERT INTO `likelion-db`.`seoul_hospital`
(`id`,
`address`,
`district`,
`category`,
`emergency_room`,
`name`,
`subdivision`)
VALUES
('A1120837',
'서울특별시 금천구 벚꽃로 286 삼성리더스타워 111~114호 (가산동)',
'서울특별시 금천구',
'C',
2,
'가산기대찬의원',
null);
SQL
복사
이제 파싱된 데이터를 SQL문으로 만듭니다.
Hospital 도메인에서 get메소드를 통해 다음과 같이 저장합니다.
String getInsertQuery(String str) 메소드 작성
public class Hospital {
...
public String getSqlInsertquery(){
String sql = String.format("INSERT INTO `hospital`.`seoul_hospital`\n" +
"(`id`,\n" +
"`address`,\n" +
"`district`,\n" +
"`category`,\n" +
"`emergency_room`,\n" +
"`name`,\n" +
"`subdivision`)\nVALUES"+"(\'"+this.getId() + "\',\'"
+ this.getAddress() + "\',\'"
+ this.getDistrict() + "\',\'"
+ this.getCategory() + "\',"
+ this.getEmergency_room() + ",\'"
+ this.getName() + "\',"
+ this.getSubdivision()
+ ");\n");
return sql;
}
...
Java
복사
처음 제가 작성한 코드는 다음과 같습니다. subdivision을 제외한 나머지 값을 작은따옴표에 넣어주었습니다. subdivision에 null값이 들어있으면 데이터베이스에 null이 아닌 ‘null’이라는 문자열이 들어가는 문제가 발생해서 다음과 같이 해결했습니다.
String getSubdivision (String name)
public class HospitalParser implements Parser<Hospital>
...
private String getSubdivision(String name) {
String subdivision = null;
String[] subdivisionTypes = {"내과", "치과", "피부과", "외과", "성형외과", "가정의학과", "소아과", "한의원", };
for (String subdivisionType : subdivisionTypes) {
if(name.contains(subdivisionType)){
subdivision = "\'"+subdivisionType+"\'";
}
}
return subdivision;
}
...
Java
복사
다음은 subdivision을 초기화할 때 사용했던 메소드 입니다. default로 null이 초기화되어있으며, 병원이름에 subdivisionTypes 배열의 값이 존재하면 작은따옴표로 묶인 subdivisionType이 할당됩니다.
String getInsertQuery(String str) 다른방식
public String getSqlInsertquery2() {
String sql = String.format("INSERT INTO `hospital`.`seoul_hospital`\n" +
"(`id`,\n" +
"`address`,\n" +
"`district`,\n" +
"`category`,\n" +
"`emergency_room`,\n" +
"`name`,\n" +
"`subdivision`)\nVALUES" +
"(\'%s\',\n" +
"(\'%s\',\n" +
"(\'%s\',\n" +
"(\'%s\',\n" +
"(\'%d\',\n" +
"(\'%s\',\n" +
"(%s);\n",
this.getId(), this.getAddress(), this.getDistrict(),
this.getCategory(), this.getEmergency_room(),
this.getName(), this.getSubdivision());
return sql;
}
Java
복사
강사님이 작성하신 코드를 참고하여 다시 작성했습니다. 조금 더 가독성 있게 되었습니다.
SQL (INSERT) 쿼리문이 잘 만들어졌는지 확인
@Test
@DisplayName("Insert 쿼리를 잘 만드는지")
void makeSqlQueryTest() {
HospitalParser hospitalParser = new HospitalParser();
Hospital hospital = hospitalParser.parse(this.line1);
String sql = "INSERT INTO `test-db`.`seoul_hospital`\n" +
"(`id`,`address`,`district`,`category`,`emergency_room`,`name`,`subdivision`)\n" +
"VALUES\n" +
"(\"A1120837\",\n" +
"\"서울특별시 금천구 벚꽃로 286 삼성리더스타워 111~114호 (가산동)\",\n" +
"\"서울특별시 금천구\",\n" +
"\"C\",\n" +
"2,\n" +
"\"가산기대찬의원\",\n" +
"\"의원\");";
Assertions.assertEquals(sql, hospital.getSqlInsertQuery());
}
Java
복사
HospitalParserTest.java
실습 파일(.csv)의 첫 번째 데이터를 활용한 sql insert문을 이용하여 Unit Test 실행
sql파일로 저장하기
FileWriter writer = new FileWriter();
for (Hospital hospital : hospitals) {
strings1.add(hospital.getSqlInsertquery());
}
writer.write(strings1, "hospital_data.sql");
Java
복사
이제 Main에서 다음과 같이 쿼리문을 sql로 저장하겠습니다.
public class FileWriter {
public void write(List<String> strs, String filename) {
File file = new File(filename);
try {
BufferedWriter writer
= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"));
for (String str : strs) {
writer.write(str);
}
writer.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Java
복사
기존에 BufferedWriter writer = new BufferedWriter(new FileWriter()); 로 파일을 저장하면 한글이 깨져서 저장되는 문제가 발생했습니다. OutputStreamWriter 로 수정해서 문제를 해결했습니다.