[Java] 자바와 DB (오라클) 연결

JDBC 

프로젝트에 ojdbc 라이브러리를 추가했으면 이제 자바코드로 오라클을 다룰 수 있다.

 

ojdbc 라이브러리 추가방법

https://itjy2.tistory.com/220

 

ojdbc 드라이버 로드

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

Class.forName을 사용하여 해당 DB사의 jdbc 드라이버를 로드 한다.

ClassNotFoundException이 발생할 수 있다.

 

DB와 연결 생성

 Connection conn = DriverManager.getConnection(
               "jdbc:oracle:thin:@localhost:1521/orcl", "hr", "hr");

DriverManager 클래스를 통해 DB와의 연결을 생성한다. 
DB접속에 필요한 URL, ID, PW를 입력한다. (본인 PC에 따라 값이 다를 수 있다.)

SQLException이 발생할 수 있다.

드라이버로드, getConnection까지 문제 없이 작성하면 DB 연결은 끝.

 

테스트

위에서 입력한 계정에 존재하는 테이블을 가지고 결과를 받아볼 수 있다.

         // 3. 생성된 연결을 통해 전송할 쿼리문 생성
         PreparedStatement pstmt = conn.prepareStatement("select * from employees");
         
         // 4. 생성된 쿼리문을 DB로 보냄
         ResultSet rs = pstmt.executeQuery();
         
         // 5. 받아온 결과를 사용
         while (rs.next()) {
            System.out.println(rs.getString("first_name") + "/" +rs.getString("salary"));
         }

 


전체 코드

아래의 코드 실행시 에러가 안뜨고 결과를 받아오면 DB 연결에 성공한 것 
hr의 기본 테이블(employees)을 테스트할 때 사용함

 public static void main(String[] args) {
      
  try {
     Class.forName("oracle.jdbc.driver.OracleDriver");
     Connection conn = DriverManager.getConnection(
           "jdbc:oracle:thin:@localhost:1521/orcl", "hr", "hr");

     PreparedStatement pstmt = conn.prepareStatement("select * from employees");

     ResultSet rs = pstmt.executeQuery();

     while (rs.next()) {
        System.out.println(rs.getString("first_name") + "/" +rs.getString("salary"));
     }

     // 6. 사용후 연결 끊기 (선연후끊)
         rs.close();
         pstmt.close();
         conn.close();
      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      } catch (SQLException e) {
         e.printStackTrace();
      }
   }

사용한 자원들(Connection, Statement .. 등등)은 사용 후 close() 를 사용해서 연결을 해제하는 것이 좋다.
연결 순서의 역순으로 연결을 해제하면 된다.

Connection, PreparedStatement, ResultSet 같은 자원들은 autocloseable을 사용해서 close() 없이 자동으로 close를 할 수 있다.   (글 맨 아래에서 사용 방법 확인)


 

Connection용 클래스 생성

DB 작업시 매번 새로 연결할 필요 없이 Connection정보를 담고 있는 클래스를 생성해 둔 후 호출해서 사용할 수 있다.

 

Connection 정보를 직접 입력한 클래스

// DB 연결용 클래스 ( Connection을 생성하고 return 해준다)
public class DBConnecter {
	public static Connection getConnection() {
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@localhost:1521/orcl";
		String id = "hr";
		String password = "hr";
		
		try {
			Class.forName(driver);
			Connection conn = DriverManager.getConnection(url, id, password);
			return conn;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
}



Connection 정보를 파일에서 받아온 클래스

원하는 경로의 txt파일에 DB 정보를 입력해 놓는다.

경로
파일내용

더보기

oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@localhost:1521/orcl
hr
hr

 

public class DBConnecter {
	public static Connection getConnection() {
		String driver;
		String url;
		String id;
		String password;
		
		try {
			BufferedReader in = new BufferedReader(new FileReader("DB.txt"));			
			driver = in.readLine();
			url = in.readLine();
			id = in.readLine();
			password = in.readLine();

			Class.forName(driver);
			Connection conn = DriverManager.getConnection(url, id, password);
			return conn;		
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
}

파일의 내용을 한줄씩 읽고, 그 파일을 자원으로 사용 한다.

코드의 내용은 길어지지만 관리하기가 편하다. 
둘 중 아무거나 편한방식으로 사용하면 될 것 같다.


 

생성해놓은 Connection 클래스 사용방법


위에서 두 가지 방법중 하나로 생성한 클래스를 다른 클래스에서 호출해서 사용하는 방법

Connection 연결을 아래의 한줄로 끝낼 수 있다.

Connection conn = DBConnecter.getConnection();

테스트용 전체 코드

	public static void main(String[] args) throws SQLException {
		Connection conn = DBConnecter.getConnection();
		String sql = "SELECT * FROM employees";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery();
        
        			rs.close();
			pstmt.close();
			conn.close();
		
		while (rs.next()) {
		System.out.printf("%d\t%s\t%s\n", rs.getInt(1), rs.getString(2), rs.getString(3));

		}
	}



autocloseable 사용


try ()내부에 자원을 선언하면 conn,pstmt,rs 등이 자동으로 close된다.

	public static void main(String[] args) {
		String sql = "SELECT * FROM employees";
		try(
			Connection conn = DBConnecter.getConnection();
			PreparedStatement pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			){
			while (rs.next()) {
				System.out.printf("%d\t%s\t%s\n", rs.getInt(1), rs.getString(2), rs.getString(3));
				
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}
	}

 

댓글

Designed by JB FACTORY