Java: File content to DB

0
post-thumbnail

파일을 읽는다.
읽은 내용을 DB에 넣는다.

파일을 읽는 것은 File ~ BufferedReader까지의 과정으로 작성했었다.
어제와 조금 다른 점이라면, ArrayList를 직접 반환값으로 삼는다는 점이다.

LoadFile

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() */
    ...
    

생성자를 호출하는 매개변수도 달라진 것을 볼 수 있다.
생성자에서 직접 데이터를 전처리하여 필요한 값을 가지고 객체를 생성한다.

Constructor

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을 거치지는 않았다.
(하지만 거쳐야 하는 게 정상일지도 모름)

DAO

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은 당연히 설정된 상태에서 작업이 이루어져야 한다.

0개의 댓글