본문으로 바로가기

자바와 오라클 연동하기 <2> - 소스코드 작성

category 코딩/Java 2016. 9. 30. 16:15







저번에는 자바와 오라클 연동을 위한 준비를 하였다. 그러면 이제 소스 코드 작성을 해보자.




  • 사용계정 : 기본 계정인 scott

  • 사용 테이블 : scott 계정에 있는 EMP 테이블




패키지 구조





패키지 구조는 위와 같다. DB라는 패키지 아래에 DBConnection과 OracleTest 두 개의 클래스를 작성한다.



  • DBConnection : DB연결 담당 클래스

  • OracleTest : DB에서 데이터를 가져오고 그것을 화면에 출력하는 클래스




소스 코드



1. DBConnection.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package DB;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class DBConnection 
{
    public static Connection dbConn;
    
        public static Connection getConnection()
        {
            Connection conn = null;
            try {
                String user = "scott"
                String pw = "tiger";
                String url = "jdbc:oracle:thin:@localhost:1521:orcl";
                
                Class.forName("oracle.jdbc.driver.OracleDriver");        
                conn = DriverManager.getConnection(url, user, pw);
                
                System.out.println("Database에 연결되었습니다.\n");
                
            } catch (ClassNotFoundException cnfe) {
                System.out.println("DB 드라이버 로딩 실패 :"+cnfe.toString());
            } catch (SQLException sqle) {
                System.out.println("DB 접속실패 : "+sqle.toString());
            } catch (Exception e) {
                System.out.println("Unkonwn error");
                e.printStackTrace();
            }
            return conn;     
        }
}
 
cs



2. OracleTest.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package DB;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
 
public class OracleTest 
{
    public static void main(String args[])
    {
        Connection conn = null// DB연결된 상태(세션)을 담은 객체
        PreparedStatement pstm = null;  // SQL 문을 나타내는 객체
        ResultSet rs = null;  // 쿼리문을 날린것에 대한 반환값을 담을 객체
        
        try {
            // SQL 문장을 만들고 만약 문장이 질의어(SELECT문)라면
            // 그 결과를 담을 ResulSet 객체를 준비한 후 실행시킨다.
            String quary = "SELECT * FROM EMP";
            
            conn = DBConnection.getConnection();
            pstm = conn.prepareStatement(quary);
            rs = pstm.executeQuery();
            
            /*  EMP 테이블의 데이터 타입
             * 
                EMPNO NOT NULL NUMBER(4) -- int
                ENAME VARCHAR2(10) -- String
                JOB VARCHAR2(9) -- String
                MGR NUMBER(4) -- int
                HIREDATE DATE -- Date
                SAL NUMBER(7,2) -- float/double
                COMM NUMBER(7,2) -- float/double
                DEPTNO NUMBER(2) -- int
            */
            
            System.out.println("EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO");
            System.out.println("============================================");
            
            while(rs.next()){
                int empno = rs.getInt(1);
                //int empno = rs.getInt("empno"); 숫자 대신 컬럼 이름을 적어도 된다.
                String ename = rs.getString(2);
                String job = rs.getString(3);
                int mgr = rs.getInt(4);
                java.sql.Date hiredate = rs.getDate(5); // Date 타입 처리
                int sal = rs.getInt(6);
                int comm = rs.getInt(7);
                int deptno = rs.getInt(8);
                
                String result = empno+" "+ename+" "+job+" "+mgr+" "+hiredate+" "+sal+" "+comm+" "+deptno;
                System.out.println(result);
            }
            
        } catch (SQLException sqle) {
            System.out.println("SELECT문에서 예외 발생");
            sqle.printStackTrace();
            
        }finally{
            // DB 연결을 종료한다.
            try{
                if ( rs != null ){rs.close();}   
                if ( pstm != null ){pstm.close();}   
                if ( conn != null ){conn.close(); }
            }catch(Exception e){
                throw new RuntimeException(e.getMessage());
            }
            
        }
    }
}
 
cs



실행결과





소스 코드 분석



1. DBConnection


자바에서 오라클에 접속할 때 접속할 계정, 계정의 비밀번호와 오라클의 주소가 필요하다. 위에서는 오라클의 기본 계정인 scott 계정을 이용하였다.


오라클 주소를 입력시 알아야 될 것이 있다. 오라클이 자신의 PC에 설치되어있다면 주소 부분에 localhost를 입력하면 된다. 만약 오라클이 다른 PC에 설치되어 있다면 설치된 PC의 IP주소를 적으면 된다. 예를 들어 오라클이 설치된 PC의 IP주소가 192.168.1.1 이라면 위에서 localhost 대신 192.168.1.1을 적어주면 된다.


오라클의 포트번호와 DB이름은 위와 같이 적으면 된다. 별도로 변경하지 않았다면 기본적으로 포트는 1521, DB의 이름은 orcl로 되어있다.



1
Class.forName("oracle.jdbc.driver.OracleDriver");
cs


여기는 JDBC 드라이버(ojdbc6.jar)를 로딩하는 부분이다. 로딩 실패시 ClassNotFoundExceptiom이 발생한다.



1
conn = DriverManager.getConnection(url, user, pw);
cs

입력된 오라클의 계정, 비밀번호, 주소를 바탕으로 오라클에 접속을 한다. 접속 실패시 SQLEXception이 발생한다. getConnection( ) 메서드는 Connection을 반환한다. 



2. OracleTest 


1
conn = DBConnection.getConnection( );
cs


DB에 연결된 상태를 con 에 담는다.



1
pstm = conn.prepareStatement(quary);
cs


연결된상태(con)를 가지고 prepareStatement(query)메서드를 통해 DB에 쿼리문을 보낸다.



1
rs = pstm.executeQuery( );
cs


PreparedStatement 클래스에 있는 executeQuery( ) 메서드는 쿼리문을 실행하는 것을 의미한다. 즉 우리가 cmd 창에 쿼리문을 적어놓고 엔터를 치면 결과가 나오듯 executeQuery( )는 쿼리문이 입력된 상태에서 엔터키를 누르는 역할을 한다.


쿼리문을 입력하고 엔터를 누르면 그에 해댕하는 결과가 나올 것이다. 그 결과를 rs(ResultSet)에 담는다. executeQuery( ) 메서드의 반환값은 ResultSet 이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
while(rs.next()){
    int empno = rs.getInt(1);
    String ename = rs.getString(2);
    String job = rs.getString(3);
    int mgr = rs.getInt(4);
    java.sql.Date hiredate = rs.getDate(5);
    int sal = rs.getInt(6);
    int comm = rs.getInt(7);
    int deptno = rs.getInt(8);
                
    String result = empno+" "+ename+" "+job+" "+mgr+" "+hiredate+" "+sal+" "+comm+" "+deptno;
    System.out.println(result);
}
cs


쿼리문이 입력되면 결과가 나온다. 그 결과를 담고 있는 rs 를 가지고 next( )를 이용하였다. while 문을 이용해 데이터가 없을 때까지 반복해서 데이터를 가지고 나온다.



RSS구독 링크추가 트위터 이메일 구독