티스토리 뷰

Java/개념정리

[ Java ] JDBC 사용하는 방법

통통푸딩 2020. 12. 8. 20:37
반응형

 JDBC란? 

JDBC란, 자바 언어로 다양한 종류의 관계형 데이터베이스에 접속하고 SQL문을 수행하여 처리하고자 할 때 사용되는 표준 SQL 인터페이스 API입니다. 즉, 자바에서 데이터베이스를 사용하기 위한 절차에 대한 규약입니다.

 

DBMS에 따라 DB를 다루는 방식이 다르다면, 사용자는 각 DBMS의 방식을 모두 알아야하기 때문에 필요한 지식이 너무많아지게 됩니다. 그래서 JDBC를 통해 추상화된 인터페이스를 제공하기만 하고, 데이터베이스의 종류에 상관없이 각 JDBC 드라이버를 통해 특정 DBMS를 사용할 수 있습니다.

DB에 접근하기 위한 인터페이스는 JDBC의 API를 사용하면 됩니다.

 

 

JDBC 드라이버

실제 DB관련 기능이 동작하려면 위에서 말한 인터페이스 만으로는 작업할 수 없습니다.

그렇기 때문에 java.sql의 인터페이스들을 상속하여 메소드의 몸체를 구현한 클래스 파일들이 필요합니다.

이 파일들을 JDBC 드라이버라고 합니다.

JDBC프로그램을 위해서는 우선 JDBC 드라이버를 준비해야합니다. JDBC드라이버는 DB가 설치된 폴더 또는 사용하는 DB를 제공하는 벤더사의 홈페이지에서 다운받을 수 있습니다.

 

JDBC드라이버를 가져왔으면 웹애플리케이션에서 자동으로 인식할 수 있도록 해줘야 합니다. 자동으로 인식되는 곳은 두 군데입니다. WAS에서 실행되는 모든 웹 애플리케이션에서 사용하고 싶다면, WAS가 설치된 HOME 폴더 및의 lib 폴더에 저장합니다. 또는 각 웹 애플리케이션에서만 사용하고 싶다면, /WEB-INF/lib 폴더에 저장해야 합니다.

여기서는 WAS가 설치된 HOME 폴더의 lib 폴더에 JDBC 드라이버를 저장합니다.

 

 

 

 


 사용방법 ( Oracle ) 

1. JDBC 드라이버 로딩

준비된 JDBC 드라이버 파일을 사용할 수 있도록 메모리에 로딩해야 합니다.

JDBC 드라이버를 메모리에 동적으로 로딩하기 위해서는 Class.forName( )을 이용합니다. 인자값으로는 JDBC 드라이버 파일 안에서 드라이버 인터페이스를 상속하고 있는 클래스이름을 패키지 이름과 함께 정확하게 명시해주어야 합니다.

 

Class.forName( )에 의해 JDBC 드라이버 파일의 드라이버 인터페이스를 상속한 클래스가 동적으로 로딩될 때 자동으로 JDBC 드라이버 인스턴스가 생성되어 준비가 완료됩니다.

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

- MySQL : com.mysql.jdbc.Driver

- Oracle : oracle.jdbc.driver.OracleDriver

- MSSQL : com.microsoft.sqlserver.jdbc.SQLServerDriver

 

 

 

2. DBMS 서버 접속

DB서버와의 연결을 해야합니다. java.sql 패키지의 DriverManager 클래스의 getConnection( ) 메소드를 이용합니다. 

실제 자바 프로그램과 데이터베이스를 네트워크상에서 연결해주는 메소드이며 연결에 성공하면 DB와 연결된 상태를 Connection 객체로 표현하여 반환합니다.

String url = "jdbc:oracle:thin:@localhost:1521:xepdb1";
Connection con = DriverManager.getConnection(url,"kim","1234");

getConnection 메소드의 인자 값은 다음과 같습니다.

 

1) String url : 접속할 서버의 URL이며, 프로토콜, 서버주소,서버포트, DB이름으로 구성된다.

     jdbc:[DBMS]:[데이터베이스식별자]

    - MySQL : jdbc:mysql://HOST[:PORT]/DBNAME[?param=value&param1=value2&..]

    - Oracle: jdbc:oracle:thin:@HOST:PORT:SID

    - MS SQL : jdbc:sqlserver://HOST[:PORT];databaseName=DB

 

2) String user : DB서버에 로그인할 계정

3) String password : DB서버에 로그인할 비밀번호

 

 

 

3. Statement

자바프로그램은 DB 쪽으로 SQL 문을 전송하고, DB는 처리된 결과를 다시 자바프로그램 쪽으로 전달해야 합니다. 이 역할을 하는 객체가 Statement입니다.

 

Statement 객체를 생성하려면 Connection 객체가 제공하는 createStatement( ) 메소드를 사용합니다.

Statement st = con.createStatement();

 

 

 

4. SQL문 실행

이번에는 Statement 객체를 이용해 DB서버로 SQL문을 전송하고 처리 결과를 받아옵니다.

SQL문을 실행하기 위해 Statement 객체에서 제공되는 메소드는 다음과 같습니다.

  • ResultSet executeQuery(String sql)

    : 메소드가 반환하는 ResultSet은 select문을 실행한 후의 결과값을 가지고 있습니다.

  • int executeUpate(String sql)

    : SQL문이 실행된(update,delete,insert) 후 영향받은 레코드의 개수를 반환합니다.

String sql = "select * from notice";
ResultSet rs = stmt.executeQuery(sql);

 

 

ResultSet

ResulSet은 executeQuery( ) 메소드에서 실행된 select 문의 결과값을 가지고 있는 객체입니다.

ResultSet 객체가 가지고 있는 select 결과값은 ResultSet 객체의 메소드를 활용해 추출하여 사용합니다.

 

ResultSet 객체는 내부적으로 위치를 나타내는 커서(Cursor)가 있습니다.

boolean next( ) 메소드는 커서 다음에 레코드가 있는지 판단하여 없으면 false, 있으면 true를 반환한 다음에 커서를 다음 레코드로 이동 시킵니다.

 

또한, ResultSet 객체에는 현재 커서의 컬럼의 값을 데이터 타입에 따라 추출하는 getter 메소드를 가지고 있습니다. getter 메소드의 인자값으로는 칼럼의 이름이나 인덱스 값을 지정합니다. 칼럼의 인덱스는 ResultSet 결과값으로 나타난 칼럼의 순서입니다. 

while (rs.next()) {
   int id = rs.getInt("ID");
   String title = rs.getString("TITLE");
   String writer = rs.getString("WRITER_ID");
   String content = rs.getString("CONTENT");
   Date regDate = rs.getDate("REGDATE");
   int hit = rs.getInt("HIT");

   System.out.printf("id: %d, title: %s, writer: %s, content: %s," +
   "date: %s, hit: %d\n", id, title, writer, content, regDate, hit);
}

next( ) 메소드를 이용해 모든 컬럼값을 돌면서 getter 메소드들을 통해 모든 데이터를 가져옵니다. 모든 데이터를 출력하는 코드입니다.

 

 

 

 

5. 메모리 해제

작업을 완료했으면, 앞에서 DB 관련처리 작업을 하면서 사용한 객체들을 모두 메모리에서 해제해야합니다.

해제하는 순서는 최근에 사용했던 객체부터 거꾸로 올라가며 해제합니다.

위에서 사용한 ResultSet , Statement, Connection 객체를 해제합니다.

rs.close( );
st.close( );
con.close( );

 

 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday