데이터를 자유롭고 편하게 사용하기 위해 오라클 DB와 연동을 해준다.
DBMS에서는 외부에서 자원을 공유하도록 한다.
공유할 때마다 공유에 필요한 자원을 할당해준다. (은행 창구)
만약 자원을 필요로 하는 프로그램이 100개라면 필요한 자원도 100개이다.
이렇게 무한대로 자원을 허락한다면 DBMS는 자원의 처리보다 연결을 관리하는데 더 많은 자원이 필요합니다. 그래서 성능이 저하될 수 있다.
그래서 이를 방지하기 위한 코드는
1. 자원을 할당 받은 후 자원을 반납한다.
2. 별도로 자원을 할당하는 객체를 만들고 그 객체에서는 미리 5개정도의 연결자원을 확보하고 필요한 객체에 공유하도록 한다.
Database connection pool(DBCP) 이라고 한다.
private Connection conn = null;
데이터베이스 연결을 위한 자원(객체)의 주소를 저장할 참조변수를 전역으로 선언
WordDAO(){
//예외.. 프로그램 실행 중에 발생하는 것.. 에러: 실행조차 안됨..
try {
// 1. 드라이버 로딩(필요한 클래스를 자바로 로드)
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("로드 성공");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("로드 실패");
}
}
public boolean connect() {
try {
// 커넥션을 시도하고 그 결과를 얻어 오는 코드...
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "11111111");
System.out.println("연결성공");
return true;
} catch (SQLException e) {
System.out.println("연결실패");
return false;
}
}
연결요청을 하고 쿼리전송 결과를 받고 연결자원을 반납하는 순서
public void insertWord(WordInfoDTO w) {
if(connect()) {
String sql="insert into word1 values (?,?,?,?,default)";
//실제 쿼리를 전달하는 객체
try {
PreparedStatement psmt = conn.prepareStatement(sql); //쿼리 객체 얻어 오기
psmt.setString(1, w.getEngName()); //mapping
psmt.setString(2, w.getKorName()); //mapping
psmt.setString(3, w.getImporFlag()); //mapping
psmt.setString(4, w.getComment()); //mapping
int r = psmt.executeUpdate(); // 쿼리 실행 후 리턴값 저장.
System.out.println(r+"건이 입력되었습니다");
conn.close(); // 연결자원을 반납
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
System.out.println("연결을 할 수 없어서 입력을 하지 못합니다.");
}
}
원하는 데이터를 처리해주었다면 바로 Close()메서드로 연결을 끊어주어야 한다.
DAO는 WordManager에서 실행해도 상관이 없지만
코드가 많아지고 협업을 하게 되면 DAO를 찾거나, 이해하는것이 어려울 수 있다.
sql에 관련된 코드들은 전부 DAO 클래스를 따로 만들어 저장해주는 것이 좋다.
쿼리문이 완성된 쿼리문이라면
String sql="select * from goods1";
Statement s1=conn.createStatement();
rs=s1.executeQuery(sql);
Statement를 사용하여 쿼리문을 넘겨주고
완성되지 않은 쿼리문이라면
String sql="select * from goods1 where name=?";
PreparedStatement p1= conn.prepareStatement(sql);
p1.setString(1, name);
rs=p1.executeQuery();
쿼리문에 부족한 부분에 ? 를 넣어주고 PreparedStatement를 사용하여 ?에 들어갈 단어를 셋팅해준다. ?가 여러개여도 가능하다.
public void search(String name) {
ResultSet rs=null;
if(connect()) {
String sql="select * from goods1 where name=?";
try {
PreparedStatement p1= conn.prepareStatement(sql);
p1.setString(1, name);
rs=p1.executeQuery();
while(rs.next()) {
System.out.println("ID: "+rs.getString("id"));
System.out.println("이름: "+rs.getString("name"));
System.out.println("수량: "+rs.getString("cnt"));
System.out.println("가격: "+rs.getString("price"));
System.out.println("판매자: "+rs.getString("sname"));
System.out.println("등록일자: "+rs.getString("indate"));
System.out.println("-----------------------");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
자료형 ResultSet의 변수를 선언한 후 쿼리문의 결과를 저장시킨다.
while(rs.next())메서드를 사용하여 rs의 모든 값에 접근하고 저장된 값들을 출력시킨다.
만약 결과물이 하나뿐인 쿼리라면(조건문에 PK를 걸어준 경우) if(rs.next())로 사용하여도 무관하다.