[Java] JDBC를 이용해 Java에 Oracle Database 연동하기
JDBC란?
Java Database Connectivity(JDBC)는 자바에서 다양한 데이터베이스에 접근하고 조작할 수 있도록 하는 API의 집합이다. SQL 명령어를 실행하여 데이터를 조회(select), 삽입(insert), 업데이트(update), 삭제(delete) 등을 할 수 있으며, 이러한 데이터베이스 작업을 자바 코드 내에서 직접 수행할 수 있다.
JDBC를 이용해 오라클 DB 연동하기
자바 프로젝트와 DB를 연동하기 위해서는 JDBC 드라이버가 필요하다. JDBC 드라이버는 각 DB를 만든 회사 홈페이지에서 따로 다운로드가 가능하며, 오라클의 경우 해당 오라클 데이터베이스 파일 내에 .jar 확장자 파일로 내장되어 있으며, 오라클 공식 홈페이지에서 별도로 다운로드가 가능하다.
(Oracle JDBC Download : https://www.oracle.com/kr/database/technologies/appdev/jdbc-downloads.html )
오라클 데이터 베이스 내에 내장된 JDBC의 위치 : C:\app\User\product\18.0.0\dbhomeXE\jdbc\lib
먼저 Java EE를 통해 jdbc를 사용할 Dynamic Web Project를 생성한다.
(필자는 jdbctest 라는 Java Project를 통해 JDBC 연동을 테스트 할 예정이다.)
프로젝트를 생성할 때 마다 일일히 Bulid Path할 번거로움 없이 jdbc.jar 파일을 복사해서 해당 경로에 붙여 넣어주면 된다.
코드 실행 순서
JDBC를 이용해 DB를 연동해서 사용하는 경우 꼭 try-catch 블록 안에서 사용해야한다. 언제나 예상치 못한 에러가 발생할 수 있기 때문이다.
1. 오라클 DB 서버 연결 관련 정보를 작성한다.
//오라클 DB 서버 연결 관련 정보
String url = "jdbc:oracle:thin:@localhost:1521:xe";//오라클의 설치 경로
String user = "system";//오라클 db 관리자 계정
String password = "1234";//비밀번호
String driver = "oracle.jdbc.driver.OracleDriver";//무슨 드라이버를 통해 연결할지를 나타냄
먼저 오라클 DB 접속을 위한 정보를 문자열로 저장한다. 여기서는 오라클의 관리자 계정인 'system'을 이용해 접속한다.
2. 드라이버 연동을 위한 클래스를 생성한다.
//오라클 드라이버 연결을 위한 Connection 클래스
Connection con = null;
// PreparedStatement : 자바에서 입력된 코드를 sql 형식의 문자열로 변환해주는 클래스(sql 사용)
//sql 인젝션 공격 방어를 위해 주로 사용함
PreparedStatement pstmt = null;
//select한 값을 저장할 ResultSet 클래스
ResultSet rs = null;
만약 해당 클래스를 선언했을 시 오류 표시가 보인다면 import java.sql.* 패키지를 import 해주면 된다.
예외처리를 위해 try - catch 블록 안에 해당 코드를 작성해주면 Java에서 DB를 사용하기 위한 모든 준비가 끝마쳐졌다.
JDBC 사용 예 1)
public class jdbctest {
public static void main(String[] args) {
//java내에서 db 사용을 위해선 무조건 try-catch 블록 안에서 사용해야한다.
try {
//오라클 DB 서버 연결 관련 정보
String url = "jdbc:oracle:thin:@localhost:1521:xe";//오라클의 설치 경로
String user = "system";//오라클 db 관리자 계정
String password = "1234";//비밀번호
String driver = "oracle.jdbc.driver.OracleDriver";//odbc8.jar oracle.jdbc.driver.OracleDriver
//드라이버 로딩
Class.forName(driver);
//오라클 DB 서버 연결
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("오라클 DB 서버 연결 성공");
//SQL문 작성
//주의사항 SQL 종결문자 ; 를 쓰면 오류남
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO sungjuk(sno, uname, kor, eng, mat, addr, wdate)");
sql.append("VALUES(sungjuk_seq.nextval,'코리아', 80, 65, 90, 'Jeju', sysdate)");
//sql 형식으로 변환 PreparedStatement : 변수를 문자열로 변환해주는 명령어
//sql 인젝션 공격 방어를 위해 주로 사용함
PreparedStatement pstmt = con.prepareStatement(sql.toString());
//sql문 실행
int cnt = pstmt.executeUpdate();//Insert, Update, Delete문 실행
System.out.println("실행결과" + cnt);
//자원반납 순서주의(후순위부터 닫음)
pstmt.close();
con.close();
} catch (Exception e) {
//예외 상황 발생시 오류 메세지 출력
System.out.println("오라클 DB 서버 연결 실패 : "+e);
}
}
}
JDBC 사용 예 2)
public class jdbctest {
public static void main(String[] args) {
//특정한 db 일련번호의 값을 출력
int sno = 12;//일련번호
Connection con = null;//db연결을 위한 클래스
PreparedStatement pstmt = null;//sql문 사용을 위한 클래스
ResultSet rs = null;//결과 출력을 위한 클래스
//무조건 try-catch 블록 안에서 처리
try {
String url = "jdbc:oracle:thin:@localhost:1521:xe";//orale db 경로
String user = "system";//접속할 계정
String password = "1234";//비밀번호
String driver = "oracle.jdbc.driver.OracleDriver";//사용할 driver
//드라이버 로딩
Class.forName(driver);
//오라클 DB 서버 연결
con = DriverManager.getConnection(url, user, password);
System.out.println("오라클DB 서버 연결 성공!!");
//SQL문 작성
//주의사항 : Java내에서 SQL문의 종결문자 ';' 를 쓰면 에러 발생
StringBuilder sql = new StringBuilder();
//특정한 일련번호를 기준으로 행 하나의 데이터를 읽어오기
sql.append(" SELECT sno, uname, kor, eng, mat, tot, aver, addr, wdate ");
sql.append(" FROM sungjuk ");
sql.append(" WHERE sno = ? ");
//sql 형식으로 변환 PreparedStatement : 해당 변수의 값을 문자열로 변환해주는 명령어
pstmt = con.prepareStatement(sql.toString());
pstmt.setInt(1, sno);
rs = pstmt.executeQuery(); //result rs변수에 select문 출력
if(rs.next()) {
System.out.println("검색 완료 자료를 출력합니다.");
//1)칼럼 순서 접근
System.out.println(rs.getInt(1)); //1번 칼럼. sno칼럼 가리킴
System.out.println(rs.getString(2)); //2번 칼럼. uname칼럼 가리킴
System.out.println(rs.getInt(3)); //3번 칼럼. kor칼럼 가리킴
System.out.println(rs.getInt(4));
System.out.println(rs.getInt(5));
System.out.println(rs.getInt(6));
System.out.println(rs.getInt(7));
System.out.println(rs.getString(8));
System.out.println(rs.getString(9));
//2)칼럼명으로 접근
System.out.println(rs.getInt("sno"));
System.out.println(rs.getString("uname"));
System.out.println(rs.getInt("kor"));
System.out.println(rs.getInt("eng"));
System.out.println(rs.getInt("mat"));
System.out.println(rs.getInt("tot"));
System.out.println(rs.getInt("aver"));
System.out.println(rs.getString("addr"));
System.out.println(rs.getString("wdate"));
} else {
System.out.println("자료가 존재하지 않습니다.");
}//if end
}catch (Exception e) {
System.out.println("오라클 JDBC의 데이터를 상세 출력하는데 실패했습니다. : " + e);
} finally {//자원반납(순서주의/후순의부터 닫음.)
try {
if(rs!=null) {rs.close();}
}catch (Exception e) {}
try {
if(pstmt!=null) {pstmt.close();}
}catch (Exception e) {}
try {
if(con!=null) {con.close();}
}catch (Exception e) {}
}
}
}
※ 여기서 ResultSet rs 의 경우 DB의 데이터를 검색(select) 할 경우에만 선언해주면 된다.