[오라클/ORACLE] JDBC로 DB 연동 | 자바로 SQL문 실행하기
- Database
- 2021. 6. 5.
JDBC(Java Database Connectivity)
JDBC는 영문 의미 그대로 자바를 이용해서 데이터베이스에 연결하는 API를 말한다. 자바 언어로 데이터베이스에 있는 데이터를 조작할 수 있다.
JDBC가 있기 이전에도 자바를 통한 데이터베이스 접근은 시도됐다. 그러나 각기 다른 구조와 특징을 가지고 있는 DBMS가 여럿이라 문제를 겪었다. 자바는 이런 한계를 극복하고자 모든 DBMS에서 공통적으로 사용할 수 있는 인터페이스와 클래스로 구성된 API를 개발했는데, 그게 JDBC다.
JDBC를 기반으로 각 DBMS는 인터페이스와 클래스를 구현한 JDBC 드라이버를 제공한다. 개발자는 자신이 사용하는 DBMS의 벤더로부터 JDBC 드라이버를 다운로드해 자바와 연동할 수 있다.
오라클의 경우 ojdbc.jar
파일을 제공한다. 내 경우엔 ojdbc8.jar
을 사용했다. 다운로드는 오라클 홈페이지에서 할 수 있다. 우선 다운받은 jar 파일을 이클립스에 넣고 라이브러리를 추가해주는 작업을 거쳐야 한다. 이 포스팅에서는 이 과정은 다루지 않고 데이터베이스를 연결하는 방법을 중심으로 작성한다.
데이터베이스 연결 방법
대략 이런 순서대로 진행된다.
- java.sql. import하기
- 드라이버 로드
- Connection
- Statement
- SQL문 생성
- SQL문 실행(executeQuery | executeUpdate)
- 선언한 모든 객체 close()
import java.sql.*;
우선 클래스 패키지명 아래에 import를 해줘야 한다.
import java.sql.*;
java.sql는 JDBC API를 정의한 모듈이다. 이 모듈 안에 있는 java.sql 패키지에서 데이터베이스 연동에 필요한 인터페이스들이 모두 들어있다. 자세한 내용은 JDK API 문서에 있다.
드라이버 로드
static {
try {
Class.forName(“oracle.jdbc.driver.OracleDriver”);
}catch(ClassNotFoundException cnfe){
cnfe.printStackTrace();
}
}
static
블록{} 안에 JDBC 드라이브 클래스를 로딩한다. static은 프로그램이 시작되자마자 곧장 메모리에 올라가기 때문에 static에 로딩한다. 구현할 때 해당 경로에서 드라이버를 찾지 못하는 예외 발생을 대비해 try catch문을 사용한다.
Connection
이제 메인 메서드 블록{}에서 Connection과 Statement 작업을 진행한다. 이때 사용되는 java.sql 인터페이스의 객체는 try catch 구현부 안에 사용해도 되고 밖에 사용해도 된다. 그러나 try catch 문안에 객체를 선언하면 블록에서 빠져나오자마자 객체가 사라진다. 마무리 단계에서 객체를 모두 닫아줘야 하고, 이 작업은 finally 블록{}에 구현하는 편이 좋기 때문에 인터페이스 객체 선언은 메인 메서드 내 try catch 블록 밖에 하겠다.
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
/* 인터페이스 설명
Connection : 특정 데이터베이스와의 연결
Statement : SQL 문을 실행하고 생성 된 결과를 반환
ResultSet : SQL문 실행시 출력되는 데이터베이스 결과 값을 나타내는 테이블
*/
Connection에는 3가지 정보가 필요하다. 1. 연결할 데이터베이스의 url 2. 계정명 3. 계정 비밀번호다.
try{
Connection con = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:XE", "scott", "tiger");
// url, user, password
// @뒤에는 ip 번호. 자신의 컴퓨터면 localhost
} catch(SQLException sqle){ // 커넥션 안됐을 경우 예외 처리
sqle.printStackTrace();
}
Statement
이제 SQL문을 실행하는 코드를 작성한다. 실행할 SQL문을 변수에 저장하고 이를 Statement의 메서드를 통해 실행한다. 이때 SQL문이 SELECT문이면 executeQuery()
메서드를 사용하고 INSERT, UPDATE, DELETE 등 DCL 문이면 executeUpdate()
를 사용한다.
stmt = con.createStatement(); // Statement 인스턴스 변수 stmt에 createStatement() 수행 결과 저장
String sql = "select * from dept"; // String 인스턴스 변수 sql에 select문 저장
rs = stmt.executeQuery(sql); // ResultSet 인스턴스 변수 rs에 executeQuery(sql) 수행 결과 저장
while (rs.next()) {
int deptno = rs.getInt("deptno");
String dname = rs.getString("dname");
String loc = rs.getString("loc");
System.out.println(deptno + " " + dname + " " + loc); // 출력해서 확인
}
전체 코드
import java.sql.*;
public class JdbcEx {
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// 인터페이스 객체 선언
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
// connection 연결
try {
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "c##scott", "tiger");
// sql문 전송, 실행
stmt = con.createStatement();
String sql = "select * from dept";
rs = stmt.executeQuery(sql);
while (rs.next()) {
int deptno = rs.getInt("deptno");
String dname = rs.getString("dname");
String loc = rs.getString("loc");
System.out.println(deptno + " " + dname + " " + loc);
}
} catch (SQLException e) {
e.printStackTrace();
} finally { // 객체 close.
if (rs != null) { // ResultSet이 null이 아닌 경우에 실행
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) { // Statement이 null이 아닌 경우에 실행
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) { // Connection이 null이 아닌 경우에 실행
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
출력값
자바로 SQL문을 실행하는 데 성공했다.
'Database' 카테고리의 다른 글
HeidiSQL을 사용하는 이유 (0) | 2022.03.26 |
---|---|
[자바/JAVA] 커넥션 풀(Connection Pool) 사용법 | 코드로보는 싱글톤 패턴 (0) | 2021.06.09 |
[데이터베이스/DB] 트랜잭션 - 기능을 단위로 묶는 이유 (0) | 2021.06.04 |
[오라클/ORACLE] PL/SQL - 트리거(TRIGGER) | 테이블 연결 후 자동화 (0) | 2021.06.03 |
[오라클/ORACLE] PL/SQL - 프로시저(PROCEDURE) | 저장하고 사용하는 SQL (0) | 2021.06.03 |