상세 컨텐츠

본문 제목

[Java] JDBC 사용법

Backend/Java

by hyeminyy 2023. 11. 13. 21:23

본문

728x90

JDBC란 ?

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

 

DBMS에 따라 DB를 다루는 방식이 다르다면, 사용자는 각 DBMS의 방식을 모두 알아야하기 때문에 필요한 지식이 너무 많아지게 된다.

그래서 JDBC를 통해 추상화된 인터페이스를 제공하기만 하고, 데이터베이스의 종류에 상관없이 각 JDBC 드라이버를 통해 특정 DBMS를 사용할 수 있다. DB에 접근하기 위한 인터페이스는 JDBC의 API를 사용하면 된다.

 

JDBC 드라이버

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

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

이 파일을 JDBC 드라이버라고 한다.

 

사용방법 (Oracle)

1. JDBC 드라이버 로딩

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

JDBC 드라이버를 메모리에 동적으로 로딩하기 위해서는 Clas.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:KOSA";
Connection conn = DriverManager.getConnection(url,"kim","1234");

 

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

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

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

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

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

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

 

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

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

 

Statement

- 자바 프로그램은 DB쪽으로 SQL문을 전송하고, DB는 처리된 결과를 다시 자바 프로그램 쪽으로 전달해야 한다.

  이 역할을 하는 객체가 Statement이다.

 

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

Statement stmt = conn.createStatement();

 

 

SQL문 실행

- Statement 객체를 이용해 DB서버로 SQL문을 전송하고 처리 결과를 받아온다.

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

  • ResultSet executeQuery(String sql)
    • 메소드가 반환하는 ResultSet은 select문을 실행한 후의 결과값을 가지고 있다.
  • int executeUpdate(String sql)
    • SQL문이 실행된 (update, delete, insert) 후 영향받은 레코드의 개수를 반환한다.
String sql = "select * from notice";
ResultSet rs = stmt.executeQuery(sql);

 

ResultSet

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

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

 

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

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

 

또한, ResultSet 객체에는 현재 커서의 컬럼의 값을 데이터 타입에 따라 추출하는 getter 메소드를 가지고 있다.

getter 메소드의 인자값으로는 칼럼의 이름이나 인덱스 값을 지정한다. 칼럼의 인덱스는 ResultSet 결과값으로 나타난 칼럼의 순서이다.

while (rs.next()){
	int id = rs.getString("TITLE");
    String title = rs.getString("WRIER_ID");
    String writer = rs.getString("CONTENT");
    Date regDate = rs.getDate("REGDATE");
    int hit = rs.getInt("HIT");
    
    Syste.out.printf("id : %d, title : %s, writer : %s, content : %s, " +
    "date : %s, hit : %d\n", id, title, writer, content, regDate, hit);
}

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

 

메모리 해제

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

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

ResultSet, Statement, Connection 객체를 해제한다.

rs.close();
stmt.close();
conn.close();

 

 

 

 

 

728x90

관련글 더보기