Java를 이용해 Oracle 에 정보를 넣어주는 방법이다.
Oracle 을 배울때는 Oracle 에서 직접 입력해 정보를 넣었는데, 이제 이를 서비스화 하고 간편화? 하기 위해 Java와 연결해 줄 것이다.
왜 이렇게 연결하나 의문이 들었는데, 우리가 회원가입을 진행할 때 아이디, 패스워드 등을 입력하는 창 - 이를 데이터 저장공간(서버)와 연결하는 코드 - 데이터 베이스. 이런 방식이라고 생각하면 된다. 사용자가 직접 select ... 이렇게 입력할 수는 없으니. 나는 이렇게 이해했다. 일단 이 과정이 '왜' 필요한 지에 대한 이해가 필요해서.
사용자 화면 (html일듯) | 데이터 서버와 사용자가 보는 화면을 연결 (Java) | 데이터 저장하는 서버 (Oracle) |
1. DB와 Java 연결 (드라이버 로드, DB 커넥트
1. 드라이버 로드.api 를 사용하기 위해 DBConnect 파일을 이용한다.
연결하기 위해 파일을 설정하는 방법은 아래 포스팅에 정리해놨으니 참고하면 된다.
이 포스팅을 따라한다면
2. DB 에 커넥트 (로그인) 까지 끝난거다. 여기까지가 Java 에 Oracle 을 연결하기 위한 준비작업이다.
3. SQL 문을 작성한다
String sql = "Insert into test values(1,'aaa')";
따옴표 안의 글이 어디서 본 것 같지 않은지? 오라클을 배웠다면 익숙할 것이다.
아직 이 블로그에는 포스팅하지 못했지만, 조만간 포스팅하면 링크를 연결해두겠다.
그래서 이 문장은 왜 작성할까? 이 SQL 문장을 사용해서 데이터 베이스 (DB)와 상호작용을 한다. SQL 문은 데이터 베이스에서 데이터를 추가 (insert into) , 수정(update set), 삭제(delete from) 하는데 사용된다.
4. PreparedStatement 객체 생성
자바에서 SQL문을 실행하려면 이를 처리할 객체가 필요하다.
PreparedStatement 로 이를 받아온다.
PreparedStatement pstmt = conn.preparedStatement(sql);
이 문장을 입력하면 conn.preparedStatement(sql) 부분에 오류가 나타난다. 이때, 예외 처리 try - catch 구문으로 변경해서 이어서 작성해주면 된다.
5. SQL문 실행 .. 검색/추가/수정/삭제
5-1) 쓰기 (추가,수정,삭제)
- 추가 (insert)
- 수정 (update)
- 삭제 (delete)
int num = pstmt.executeUpdate();
SQL 을 실행하고, 적용된 줄 수가 포함된다.
더 상세하게 설명하면, pstmt 는 4에서 작성한 PreparedStatement 의 객체이다. executeUpdate() 메서드는 DML 문을 실행하고 영향을 받은 행 수를 반환한다. 그리고 이 값을 num에 할당한다.
아래와 같은 방식으로 사용한다.
5-2) 검색 (select)
ResultSet rs = pstmt.executeQuery();
검색 결과를 ResultSet이라는 객체에 담아서 반환한다. ResultSet에서 데이터를 한 줄씩 꺼내 처리한다.
rs.next() 는 다음줄로 이동한다. 이동한 줄에 데이터가 있으면 true, 없으면 false 를 반환한다.
public BoardVo select(int num) {
BoardVo vo = null; // 조회된 결과를 vo 변수에 담아 리턴하기 위해 BoardVo 객체를 null로 초기화
Connection conn = dbconn.conn(); //데이터 베이스 연결을 위한 Connection 객체를 생성
String sql = "select * from board where num=?";
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num); //SQL 쿼리문의 '?'에 매개변수 'num' 값
ResultSet rs = pstmt.executeQuery();// select 실행
if (rs.next()) {// 다음 줄로 이동하여 데이터 있는지 확인
int num2 = rs.getInt(1); //ResultSet 객체에서 첫번째 컬럼의 값을 가져와서 변수 num2에 저장
String writer = rs.getString(2);
Date date = rs.getDate(3);
String title = rs.getString(4);
String content = rs.getString(5);
vo = new BoardVo(num2, writer, date, title, content); //조회된 결과를 담기 위해 BoardVo 객체를 생성한다.
//위에서 받은 값들을 저장한다.
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
conn.close(); //데이터 베이스 연결 종료
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
5-3) 검색 심화
<한줄 검색>
PK (Primary Key)로 검색한다.
if(rs.next()) {
String writer = rs.getString(1);
//ResultSet 객체의 getString() 메소드를 호출하여 현재 레코드에서 첫번째 컬럼의 값을 문자열로 가져온다.
int num = rs.getInt(2);
return new Vo(writer,num);
//Vo 클래스의 생성자를 호출하여, 가져온 writer 와 num 값을 가지고 새로운 Vo 객체를 만들어 반환한다.
}
return null;
<여러줄 검색>
ArrayList<vo> list = new ArrayList<>();
while(rs.next(){ //데이터가 있는 동안 반복
String writer = rs.getString(1);
//ResultSet에서 첫 번째 컬럼의 데이터를 가져와서 writer 변수에 저장한다.
int num = rs.getInt(2);
Vo v = new Vo(writer,num); //가져온 변수 담기
list.add(new Vo (writer,num)); //담은 변수를 리스트에 추가
}
6. conn 닫기
conn.close ();
다 사용한 db 연결을 끊는다.