앞에서 java와 mysql을 연동하였다.
더 나아가서 csv 파일로 저장된 데이터를 mysql에 insert를 도전하였다.
이전에 서울시 병원 csv 파일로 db를 만드는 실습을 하였는데, 동일한 데이터를 이용하여 db를 만들었다.
하나의 insert를 할 때는 executeUpdate()를 사용하였다. 하지만 여러개를 입력할 때는 addBatch()를 해서 쿼리를 실행하지 않고 쿼리 구문을 메모리에 올려두었다가, executeBatch()로 DB에 모두 전송한다.
//csv filename 입력하면 sql로 저장
public void add(String filename) throws SQLException, ClassNotFoundException, IOException {
ConnectionMaker cm = new ConnectionMaker();
//LineReader : csv 파일을 받아서 Hospital 객체 리스트로 반환하는 메서드
LineReader lr = new LineReader(new HospitalParser());
Connection conn = cm.makeConnection();
PreparedStatement ps = conn.prepareStatement("INSERT INTO seoul_hospital(id, address, district, category, emergency_room, name, subdivision)"
+"VALUES (?, ?, ?, ?, ?, ?, ?);");
List<Hospital> hospitals= lr.readLines(filename);
//반환된 리스트로 sql 구문을 완성한다.
for (Hospital hospital : hospitals) {
ps.setString(1, hospital.getId());
ps.setString(2, hospital.getAddress());
ps.setString(3, hospital.getDistrict());
ps.setString(4, hospital.getCategory());
ps.setInt(5, hospital.getEmergencyRoom());
ps.setString(6, hospital.getName());
ps.setString(7, hospital.getSubdivision());
//쿼리를 저장했다가 한 번에 실행
ps.addBatch();
ps.clearParameters();
//실행을 확인하기 위한 출력구문
System.out.println(hospital.getId()+"이 저장되었습니다.");
}
ps.executeBatch();
ps.clearBatch();
ps.close();
conn.close();
}
//테스트 코드로 진행하지 않고 main메서드로 테스트...(메인 메서드가 익숙할 때라..)
public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {
HospitalDao hd = new HospitalDao();
String filename = "../data/서울병원3개.csv";
hd.add(filename);
}
문제)
데이터에서 id가 길지 않은데 크기가 초과한다는 에러가 반복해서 발생하였다. 그리고 나머지 데이터만 저장되었다.
해결)
위의 코드와는 상관없이 LineReader에서 첫 번째 줄은 제목이라 파싱을 하지 않는 코드가 있는데 이 것이 문제가 되었다. 그래서 csv에 제목을 달아주고 진행하였더니 해결되었다.