파일을 읽는다.
읽은 내용을 DB에 넣는다.
파일을 읽는 것은 File
~ BufferedReader
까지의 과정으로 작성했었다.
어제와 조금 다른 점이라면, ArrayList를 직접 반환값으로 삼는다는 점이다.
package proto;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class LoadFile {
public ArrayList<StudentVO> getStudentFile() throws IOException {
// TODO Auto-generated method stub
ArrayList<StudentVO> list = null;
list = new ArrayList<StudentVO>();
File file = new File("./Studentlist.csv");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line= null;
StudentVO vo = null;
while((line=br.readLine())!=null) {
//System.out.println(line);
vo = new StudentVO(line);
list.add(vo);
}
br.close();
fr.close();
return list;
}/* END getStudentFile() */
...
생성자를 호출하는 매개변수도 달라진 것을 볼 수 있다.
생성자에서 직접 데이터를 전처리하여 필요한 값을 가지고 객체를 생성한다.
package proto;
public class StudentVO {
/* field */
private int stdNo;
private String stdName;
private String stdMajor;
private int stdAge;
/* constructor */
public StudentVO(String data) {
String[] temp = data.split(",");
stdNo = Integer.parseInt(temp[0].trim());
stdName = temp[1].trim();
stdMajor = temp[2].trim();
stdAge = Integer.parseInt(temp[3].trim());
}
...
아주 가벼운 수준의 전처리를 통해 필드값을 초기화하고 있다.
(사실 에러 많이 났음)
DAO에서 INSERT
쿼리를 데이터베이스에 날릴 때 ArrayList가 사용된다.
테스트를 위해 작성한 코드라 Business Logic을 거치지는 않았다.
(하지만 거쳐야 하는 게 정상일지도 모름)
package proto;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
public class StudentDAO {
public boolean insertStData(ArrayList<StudentVO> list) throws SQLException {
boolean flag = false;
int affectedCount = 0;
Connection con = ConnectionManager.getStConnection();
Statement stmt = null;
for(StudentVO vo : list) {
String sql = "insert into student values ("+vo.getStdNo()+",'"+vo.getStdName()+"', '"+vo.getStdMajor()+"',"+vo.getStdAge()+");";
stmt = con.createStatement();
affectedCount = stmt.executeUpdate(sql);
}
stmt.close();
con.close();
if(affectedCount > 0) {
flag = true;
}
return flag;
}// insertStData()
...
📌 쿼리에 문자열을 포함할 때는, 반드시 '
를 붙여줘야 한다는 사실을 잊지 말아야겠다
'
이거 안 붙였다가 column에 관한 Exception을 겪었는데, 도저히 보이질 않았다.
VO 클래스를 확인하다가 '아 문자열' 갑자기 떠올라서 다행이었지... 굉장히 오래 방황할 뻔 했다.
PreparedStatement
를 써주는 것이 훨씬 좋고 안정적이라고 설명을 들었지만, 후딱후딱 테스트하기 위해 바로바로 Statement
를 사용했다.
(사실 저게 왜 더 좋은지에 대해서는 정신이 없어서 아직 알아보지 못하였음)
Connection
은 당연히 설정된 상태에서 작업이 이루어져야 한다.